/ src / components / HighlightedCode.tsx
HighlightedCode.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import * as React from 'react';
  3  import { memo, useEffect, useMemo, useRef, useState } from 'react';
  4  import { useSettings } from '../hooks/useSettings.js';
  5  import { Ansi, Box, type DOMElement, measureElement, NoSelect, Text, useTheme } from '../ink.js';
  6  import { isFullscreenEnvEnabled } from '../utils/fullscreen.js';
  7  import sliceAnsi from '../utils/sliceAnsi.js';
  8  import { countCharInString } from '../utils/stringUtils.js';
  9  import { HighlightedCodeFallback } from './HighlightedCode/Fallback.js';
 10  import { expectColorFile } from './StructuredDiff/colorDiff.js';
 11  type Props = {
 12    code: string;
 13    filePath: string;
 14    width?: number;
 15    dim?: boolean;
 16  };
 17  const DEFAULT_WIDTH = 80;
 18  export const HighlightedCode = memo(function HighlightedCode(t0) {
 19    const $ = _c(21);
 20    const {
 21      code,
 22      filePath,
 23      width,
 24      dim: t1
 25    } = t0;
 26    const dim = t1 === undefined ? false : t1;
 27    const ref = useRef(null);
 28    const [measuredWidth, setMeasuredWidth] = useState(width || DEFAULT_WIDTH);
 29    const [theme] = useTheme();
 30    const settings = useSettings();
 31    const syntaxHighlightingDisabled = settings.syntaxHighlightingDisabled ?? false;
 32    let t2;
 33    bb0: {
 34      if (syntaxHighlightingDisabled) {
 35        t2 = null;
 36        break bb0;
 37      }
 38      let t3;
 39      if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 40        t3 = expectColorFile();
 41        $[0] = t3;
 42      } else {
 43        t3 = $[0];
 44      }
 45      const ColorFile = t3;
 46      if (!ColorFile) {
 47        t2 = null;
 48        break bb0;
 49      }
 50      let t4;
 51      if ($[1] !== code || $[2] !== filePath) {
 52        t4 = new ColorFile(code, filePath);
 53        $[1] = code;
 54        $[2] = filePath;
 55        $[3] = t4;
 56      } else {
 57        t4 = $[3];
 58      }
 59      t2 = t4;
 60    }
 61    const colorFile = t2;
 62    let t3;
 63    let t4;
 64    if ($[4] !== width) {
 65      t3 = () => {
 66        if (!width && ref.current) {
 67          const {
 68            width: elementWidth
 69          } = measureElement(ref.current);
 70          if (elementWidth > 0) {
 71            setMeasuredWidth(elementWidth - 2);
 72          }
 73        }
 74      };
 75      t4 = [width];
 76      $[4] = width;
 77      $[5] = t3;
 78      $[6] = t4;
 79    } else {
 80      t3 = $[5];
 81      t4 = $[6];
 82    }
 83    useEffect(t3, t4);
 84    let t5;
 85    bb1: {
 86      if (colorFile === null) {
 87        t5 = null;
 88        break bb1;
 89      }
 90      let t6;
 91      if ($[7] !== colorFile || $[8] !== dim || $[9] !== measuredWidth || $[10] !== theme) {
 92        t6 = colorFile.render(theme, measuredWidth, dim);
 93        $[7] = colorFile;
 94        $[8] = dim;
 95        $[9] = measuredWidth;
 96        $[10] = theme;
 97        $[11] = t6;
 98      } else {
 99        t6 = $[11];
100      }
101      t5 = t6;
102    }
103    const lines = t5;
104    let t6;
105    bb2: {
106      if (!isFullscreenEnvEnabled()) {
107        t6 = 0;
108        break bb2;
109      }
110      const lineCount = countCharInString(code, "\n") + 1;
111      let t7;
112      if ($[12] !== lineCount) {
113        t7 = lineCount.toString();
114        $[12] = lineCount;
115        $[13] = t7;
116      } else {
117        t7 = $[13];
118      }
119      t6 = t7.length + 2;
120    }
121    const gutterWidth = t6;
122    let t7;
123    if ($[14] !== code || $[15] !== dim || $[16] !== filePath || $[17] !== gutterWidth || $[18] !== lines || $[19] !== syntaxHighlightingDisabled) {
124      t7 = <Box ref={ref}>{lines ? <Box flexDirection="column">{lines.map((line, i) => gutterWidth > 0 ? <CodeLine key={i} line={line} gutterWidth={gutterWidth} /> : <Text key={i}><Ansi>{line}</Ansi></Text>)}</Box> : <HighlightedCodeFallback code={code} filePath={filePath} dim={dim} skipColoring={syntaxHighlightingDisabled} />}</Box>;
125      $[14] = code;
126      $[15] = dim;
127      $[16] = filePath;
128      $[17] = gutterWidth;
129      $[18] = lines;
130      $[19] = syntaxHighlightingDisabled;
131      $[20] = t7;
132    } else {
133      t7 = $[20];
134    }
135    return t7;
136  });
137  function CodeLine(t0) {
138    const $ = _c(13);
139    const {
140      line,
141      gutterWidth
142    } = t0;
143    let t1;
144    if ($[0] !== gutterWidth || $[1] !== line) {
145      t1 = sliceAnsi(line, 0, gutterWidth);
146      $[0] = gutterWidth;
147      $[1] = line;
148      $[2] = t1;
149    } else {
150      t1 = $[2];
151    }
152    const gutter = t1;
153    let t2;
154    if ($[3] !== gutterWidth || $[4] !== line) {
155      t2 = sliceAnsi(line, gutterWidth);
156      $[3] = gutterWidth;
157      $[4] = line;
158      $[5] = t2;
159    } else {
160      t2 = $[5];
161    }
162    const content = t2;
163    let t3;
164    if ($[6] !== gutter) {
165      t3 = <NoSelect fromLeftEdge={true}><Text><Ansi>{gutter}</Ansi></Text></NoSelect>;
166      $[6] = gutter;
167      $[7] = t3;
168    } else {
169      t3 = $[7];
170    }
171    let t4;
172    if ($[8] !== content) {
173      t4 = <Text><Ansi>{content}</Ansi></Text>;
174      $[8] = content;
175      $[9] = t4;
176    } else {
177      t4 = $[9];
178    }
179    let t5;
180    if ($[10] !== t3 || $[11] !== t4) {
181      t5 = <Box flexDirection="row">{t3}{t4}</Box>;
182      $[10] = t3;
183      $[11] = t4;
184      $[12] = t5;
185    } else {
186      t5 = $[12];
187    }
188    return t5;
189  }
190  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJ1c2VTZXR0aW5ncyIsIkFuc2kiLCJCb3giLCJET01FbGVtZW50IiwibWVhc3VyZUVsZW1lbnQiLCJOb1NlbGVjdCIsIlRleHQiLCJ1c2VUaGVtZSIsImlzRnVsbHNjcmVlbkVudkVuYWJsZWQiLCJzbGljZUFuc2kiLCJjb3VudENoYXJJblN0cmluZyIsIkhpZ2hsaWdodGVkQ29kZUZhbGxiYWNrIiwiZXhwZWN0Q29sb3JGaWxlIiwiUHJvcHMiLCJjb2RlIiwiZmlsZVBhdGgiLCJ3aWR0aCIsImRpbSIsIkRFRkFVTFRfV0lEVEgiLCJIaWdobGlnaHRlZENvZGUiLCJ0MCIsIiQiLCJfYyIsInQxIiwidW5kZWZpbmVkIiwicmVmIiwibWVhc3VyZWRXaWR0aCIsInNldE1lYXN1cmVkV2lkdGgiLCJ0aGVtZSIsInNldHRpbmdzIiwic3ludGF4SGlnaGxpZ2h0aW5nRGlzYWJsZWQiLCJ0MiIsImJiMCIsInQzIiwiU3ltYm9sIiwiZm9yIiwiQ29sb3JGaWxlIiwidDQiLCJjb2xvckZpbGUiLCJjdXJyZW50IiwiZWxlbWVudFdpZHRoIiwidDUiLCJiYjEiLCJ0NiIsInJlbmRlciIsImxpbmVzIiwiYmIyIiwibGluZUNvdW50IiwidDciLCJ0b1N0cmluZyIsImxlbmd0aCIsImd1dHRlcldpZHRoIiwibWFwIiwibGluZSIsImkiLCJDb2RlTGluZSIsImd1dHRlciIsImNvbnRlbnQiXSwic291cmNlcyI6WyJIaWdobGlnaHRlZENvZGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgbWVtbywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VTZXR0aW5ncyB9IGZyb20gJy4uL2hvb2tzL3VzZVNldHRpbmdzLmpzJ1xuaW1wb3J0IHtcbiAgQW5zaSxcbiAgQm94LFxuICB0eXBlIERPTUVsZW1lbnQsXG4gIG1lYXN1cmVFbGVtZW50LFxuICBOb1NlbGVjdCxcbiAgVGV4dCxcbiAgdXNlVGhlbWUsXG59IGZyb20gJy4uL2luay5qcydcbmltcG9ydCB7IGlzRnVsbHNjcmVlbkVudkVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9mdWxsc2NyZWVuLmpzJ1xuaW1wb3J0IHNsaWNlQW5zaSBmcm9tICcuLi91dGlscy9zbGljZUFuc2kuanMnXG5pbXBvcnQgeyBjb3VudENoYXJJblN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZ1V0aWxzLmpzJ1xuaW1wb3J0IHsgSGlnaGxpZ2h0ZWRDb2RlRmFsbGJhY2sgfSBmcm9tICcuL0hpZ2hsaWdodGVkQ29kZS9GYWxsYmFjay5qcydcbmltcG9ydCB7IGV4cGVjdENvbG9yRmlsZSB9IGZyb20gJy4vU3RydWN0dXJlZERpZmYvY29sb3JEaWZmLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBjb2RlOiBzdHJpbmdcbiAgZmlsZVBhdGg6IHN0cmluZ1xuICB3aWR0aD86IG51bWJlclxuICBkaW0/OiBib29sZWFuXG59XG5cbmNvbnN0IERFRkFVTFRfV0lEVEggPSA4MFxuXG5leHBvcnQgY29uc3QgSGlnaGxpZ2h0ZWRDb2RlID0gbWVtbyhmdW5jdGlvbiBIaWdobGlnaHRlZENvZGUoe1xuICBjb2RlLFxuICBmaWxlUGF0aCxcbiAgd2lkdGgsXG4gIGRpbSA9IGZhbHNlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCByZWYgPSB1c2VSZWY8RE9NRWxlbWVudD4obnVsbClcbiAgY29uc3QgW21lYXN1cmVkV2lkdGgsIHNldE1lYXN1cmVkV2lkdGhdID0gdXNlU3RhdGUod2lkdGggfHwgREVGQVVMVF9XSURUSClcbiAgY29uc3QgW3RoZW1lXSA9IHVzZVRoZW1lKClcbiAgY29uc3Qgc2V0dGluZ3MgPSB1c2VTZXR0aW5ncygpXG4gIGNvbnN0IHN5bnRheEhpZ2hsaWdodGluZ0Rpc2FibGVkID1cbiAgICBzZXR0aW5ncy5zeW50YXhIaWdobGlnaHRpbmdEaXNhYmxlZCA/PyBmYWxzZVxuXG4gIGNvbnN0IGNvbG9yRmlsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChzeW50YXhIaWdobGlnaHRpbmdEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgQ29sb3JGaWxlID0gZXhwZWN0Q29sb3JGaWxlKClcbiAgICBpZiAoIUNvbG9yRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb2xvckZpbGUoY29kZSwgZmlsZVBhdGgpXG4gIH0sIFtjb2RlLCBmaWxlUGF0aCwgc3ludGF4SGlnaGxpZ2h0aW5nRGlzYWJsZWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF3aWR0aCAmJiByZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgeyB3aWR0aDogZWxlbWVudFdpZHRoIH0gPSBtZWFzdXJlRWxlbWVudChyZWYuY3VycmVudClcbiAgICAgIGlmIChlbGVtZW50V2lkdGggPiAwKSB7XG4gICAgICAgIHNldE1lYXN1cmVkV2lkdGgoZWxlbWVudFdpZHRoIC0gMilcbiAgICAgIH1cbiAgICB9XG4gIH0sIFt3aWR0aF0pXG5cbiAgY29uc3QgbGluZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoY29sb3JGaWxlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gY29sb3JGaWxlLnJlbmRlcih0aGVtZSwgbWVhc3VyZWRXaWR0aCwgZGltKVxuICB9LCBbY29sb3JGaWxlLCB0aGVtZSwgbWVhc3VyZWRXaWR0aCwgZGltXSlcblxuICAvLyBHdXR0ZXIgd2lkdGggbWF0Y2hlcyBDb2xvckZpbGUncyBsYXlvdXQgaW4gbGliLnJzOiBzcGFjZSArIHJpZ2h0LWFsaWduZWRcbiAgLy8gbGluZSBudW1iZXIgKG1heF9kaWdpdHMgPSBsaW5lQ291bnQudG9TdHJpbmcoKS5sZW5ndGgpICsgc3BhY2UuIE5vIG1hcmtlclxuICAvLyBjb2x1bW4gbGlrZSB0aGUgZGlmZiBwYXRoLiBXcmFwIGluIDxOb1NlbGVjdD4gc28gZnVsbHNjcmVlbiBzZWxlY3Rpb25cbiAgLy8geWllbGRzIGNsZWFuIGNvZGUgd2l0aG91dCBsaW5lIG51bWJlcnMuIE9ubHkgc3BsaXQgaW4gZnVsbHNjcmVlbiBtb2RlXG4gIC8vICh+NMOXIERPTSBub2RlcyArIHNsaWNlQW5zaSBjb3N0KTsgbm9uLWZ1bGxzY3JlZW4gdXNlcyB0ZXJtaW5hbC1uYXRpdmVcbiAgLy8gc2VsZWN0aW9uIHdoZXJlIG5vU2VsZWN0IGlzIG1lYW5pbmdsZXNzLlxuICBjb25zdCBndXR0ZXJXaWR0aCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghaXNGdWxsc2NyZWVuRW52RW5hYmxlZCgpKSByZXR1cm4gMFxuICAgIGNvbnN0IGxpbmVDb3VudCA9IGNvdW50Q2hhckluU3RyaW5nKGNvZGUsICdcXG4nKSArIDFcbiAgICByZXR1cm4gbGluZUNvdW50LnRvU3RyaW5nKCkubGVuZ3RoICsgMlxuICB9LCBbY29kZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IHJlZj17cmVmfT5cbiAgICAgIHtsaW5lcyA/IChcbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAge2xpbmVzLm1hcCgobGluZSwgaSkgPT5cbiAgICAgICAgICAgIGd1dHRlcldpZHRoID4gMCA/IChcbiAgICAgICAgICAgICAgPENvZGVMaW5lIGtleT17aX0gbGluZT17bGluZX0gZ3V0dGVyV2lkdGg9e2d1dHRlcldpZHRofSAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFRleHQga2V5PXtpfT5cbiAgICAgICAgICAgICAgICA8QW5zaT57bGluZX08L0Fuc2k+XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICApIDogKFxuICAgICAgICA8SGlnaGxpZ2h0ZWRDb2RlRmFsbGJhY2tcbiAgICAgICAgICBjb2RlPXtjb2RlfVxuICAgICAgICAgIGZpbGVQYXRoPXtmaWxlUGF0aH1cbiAgICAgICAgICBkaW09e2RpbX1cbiAgICAgICAgICBza2lwQ29sb3Jpbmc9e3N5bnRheEhpZ2hsaWdodGluZ0Rpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L0JveD5cbiAgKVxufSlcblxuZnVuY3Rpb24gQ29kZUxpbmUoe1xuICBsaW5lLFxuICBndXR0ZXJXaWR0aCxcbn06IHtcbiAgbGluZTogc3RyaW5nXG4gIGd1dHRlcldpZHRoOiBudW1iZXJcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBndXR0ZXIgPSBzbGljZUFuc2kobGluZSwgMCwgZ3V0dGVyV2lkdGgpXG4gIGNvbnN0IGNvbnRlbnQgPSBzbGljZUFuc2kobGluZSwgZ3V0dGVyV2lkdGgpXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICA8Tm9TZWxlY3QgZnJvbUxlZnRFZGdlPlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8QW5zaT57Z3V0dGVyfTwvQW5zaT5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9Ob1NlbGVjdD5cbiAgICAgIDxUZXh0PlxuICAgICAgICA8QW5zaT57Y29udGVudH08L0Fuc2k+XG4gICAgICA8L1RleHQ+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsSUFBSSxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUNsRSxTQUFTQyxXQUFXLFFBQVEseUJBQXlCO0FBQ3JELFNBQ0VDLElBQUksRUFDSkMsR0FBRyxFQUNILEtBQUtDLFVBQVUsRUFDZkMsY0FBYyxFQUNkQyxRQUFRLEVBQ1JDLElBQUksRUFD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