File size: 2,368 Bytes
b39afbe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * Copyright (c) 2023 MERCENARIES.AI PTE. LTD.
 * All rights reserved.
 */

import { ChatRenderer } from 'omni-client-services';

// An extension to render markdown in a chat message

class OmniComponentMetaRenderer extends ChatRenderer {
  // opts: https://marked.js.org/using_advanced
  constructor(opts?: NonNullable<object>) {
    opts ??= {};
    super({ id: 'omni/component-meta' }, opts);
  }

  async load(): Promise<void> {}

  render(content: { type: string; value: any }): string {
    let text = '';
    if (content.value?.source) {
      // TODO: [security] Filter all strings for XSS
      text = `
        <div x-data='${JSON.stringify(content.value)}'>
          <div x-show='title' class="font-bold text-center bg-gray-700 mb-2 text-gray-100" >
            <span x-text='title' ></span>
          </div>
          <div x-show='source' class=' bg-gray-300 m-1 pb-1 font-mono'>
            <div class="font-bold text-center bg-gray-700 mb-2 text-gray-100" >
              <span x-text='source?.title' ></span>
            </div>

            <div class='text-xs pl-2'>
              <div x-show='source?.authors'>
                <span class='font-semibold'>Authors: </span>
                <span  x-text='source?.authors?.join?.(", ")||source?.authors'></span>
              </div>
            </div>
            <p class='text-xs mt-1 mb-2 pl-2' x-text='source?.summary || "No Summary Available"'></p>
            <template x-for='(linkUrl,linkName) in source?.links' :key="linkName">
                <div class='text-xs  pl-1'>🔗<a class='text-blue-600  font-semibold cursor-pointer hover:text-blue-800'' :href='linkUrl' x-text='linkName' target='_blank' ></a></div>
            </template>
          </div>
        </div>`;
    } else {
      text = `
        <div x-data='${JSON.stringify(content.value)}'>
          <div x-show='title' class="font-bold text-center bg-gray-700 mb-2 text-gray-100" >
            <span x-text='title'></span>
          </div>
          <div class=' bg-gray-300 m-1 pb-1 font-mono'>
            <p class='text-xs mt-1 mb-2  pl-2 ' x-text='"No meta info available"'></p>
          </div>
        </div>
      `;
    }

    // const escapedContent = escapeHtmlSpecialChars(text);
    // const sanitizedHtml =  DOMPurify.sanitize(escapedContent);

    return text;
  }
}

export default OmniComponentMetaRenderer;