File size: 2,332 Bytes
0a08909
 
 
6b8f69a
 
 
 
 
 
 
 
 
 
 
5d7d435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6b8f69a
 
5d7d435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6b8f69a
5d7d435
 
 
3a22cf3
 
 
 
 
5d7d435
 
3a22cf3
 
 
 
 
5d7d435
 
 
 
 
 
6b8f69a
5d7d435
6b8f69a
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
import { useMemo } from 'react';
import { MessageBase } from '../types';
import { CLEANED_SEPARATOR } from '../constants';

const PAIRS: Record<string, string> = {
  '┍': 'β”‘',
  '┝': 'β”₯',
  'β”œ': '─',
  'β”•': 'β”™',
};

const MIDDLE_STARTER = '┝';
const MIDDLE_SEPARATOR = 'β”Ώ';

export const getCleanedUpMessages = ({
  content,
  role,
}: Pick<MessageBase, 'role' | 'content'>) => {
  if (role === 'user') {
    return {
      content,
    };
  }
  if (content.split(CLEANED_SEPARATOR).length === 2) {
    return {
      logs: content.split(CLEANED_SEPARATOR)[0],
      content: content.split(CLEANED_SEPARATOR)[1],
    };
  }
  const [logs = '', answer = ''] = content.split('<ANSWER>');
  const cleanedLogs = [];
  let left = 0;
  let right = 0;
  while (right < logs.length) {
    if (Object.keys(PAIRS).includes(content[right])) {
      cleanedLogs.push(content.substring(left, right));
      left = right++;
      while (
        right < content.length &&
        PAIRS[content[left]] !== content[right]
      ) {
        right++;
      }
      if (content[left] === MIDDLE_STARTER) {
        // add the text alignment so it can be shown as a table
        const separators = logs
          .substring(left, right)
          .split(MIDDLE_SEPARATOR).length;
        if (separators > 0) {
          cleanedLogs.push(
            Array(separators + 1)
              .fill('|')
              .join(' :- '),
          );
        }
      }
      left = ++right;
    } else {
      right++;
    }
  }
  cleanedLogs.push(content.substring(left, right));
  const [answerText, imagesStr = ''] = answer.split('<VIZ>');
  const [imagesArrayStr, ...rest] = imagesStr.split('</VIZ>');
  const images = imagesArrayStr
    .split('</IMG>')
    .map(str => str.replace('<IMG>', ''))
    .slice(0, -1);
  return {
    logs: cleanedLogs.join('').replace(/β”‚/g, '|').split('|\n\n|').join('|\n|'),
    content:
      answerText.replace('</</ANSWER>', '').replace('</ANSWER>', '') +
      images.map((_, index) => `![answers-${index}](/loading.gif)`).join('') +
      rest.join(''),
    images: images,
  };
};

export const useCleanedUpMessages = ({ content, role }: MessageBase) => {
  const cleanedMessage = useMemo(() => {
    return getCleanedUpMessages({ content, role });
  }, [content, role]);
  return cleanedMessage;
};