function transformElement()

in packages/@rnw-scripts/doxysaurus/src/markdown.ts [53:183]


  function transformElement(
    element: DoxDescriptionElement,
    index: number,
  ): void {
    switch (element['#name']) {
      case '__text__':
        return writeText(element._);
      case 'sp':
        return write(' ');
      case 'nonbreakablespace':
        return write(' ');
      case 'ensp':
        return write(' ');
      case 'emsp':
        return write(' ');
      case 'thinsp':
        return write(' ');
      case 'emphasis':
        return write('*', element.$$, '*');
      case 'bold':
        return write('**', element.$$, '**');
      case 'mdash':
        return write('—');
      case 'ndash':
        return write('–');
      case 'linebreak':
        return write('<br/>');
      case 'para':
        return writeBlock(
          index ? '\n\n' : '',
          ' '.repeat(index ? indent : 0),
          element.$$,
        );
      case 'orderedlist':
      case 'itemizedlist':
        return writeWithContext(element, index ? '\n' : '', element.$$);
      case 'listitem':
        const itemBullet =
          last(context)?.['#name'] === 'orderedlist' ? '1. ' : '* ';
        return writeWithIndent(
          itemBullet.length,
          index ? '\n' : '',
          ' '.repeat(indent),
          itemBullet,
          element.$$,
        );
      case 'parameterlist':
        if (element.$.kind === 'param') {
          return write(index ? '\n\n' : '', '### Parameters\n', element.$$);
        } else if (element.$.kind === 'retval') {
          return write(index ? '\n\n' : '', '### Return values\n', element.$$);
        } else {
          return log.warning(`Unknown parameterlist kind {${element.$.kind}}.`);
        }
      case 'parameteritem':
        return write('\n* ', element.$$);
      case 'parametername':
        return writeCode('`', element.$$, '` ');
      case 'computeroutput':
        return writeCode('`', element.$$, '`');
      case 'programlisting':
        return writeCode('\n```cpp\n', element.$$, '```\n');
      case 'codeline':
        return write(element.$$, '\n');
      case 'xrefsect':
        return write('\n> ', element.$$);
      case 'simplesect':
        if (element.$.kind === 'attention') {
          return write('> ', element.$$);
        } else if (element.$.kind === 'return') {
          return write(index ? '\n\n' : '', '### Returns\n\n', element.$$);
        } else if (element.$.kind === 'see') {
          return write('**See also**: ', element.$$);
        } else {
          log.warning(`[element.$.kind=${element.$.kind}]: not supported.`);
          return;
        }
      case 'formula':
        let s = (element._ || '').trim();
        if (s.startsWith('$') && s.endsWith('$')) {
          return write(s);
        }
        if (s.startsWith('\\[') && s.endsWith('\\]')) {
          s = s.substring(2, s.length - 2).trim();
        }
        return write('\n$$\n' + s + '\n$$\n');
      case 'preformatted':
        return writeCode('\n<pre>', element.$$, '</pre>\n');
      case 'sect1':
      case 'sect2':
      case 'sect3':
      case 'sect4':
        return writeWithContext(element, index ? '\n\n' : '', element.$$);
      case 'title':
        const level = Number((last(context)?.['#name'] || '0').slice(-1));
        return write('#'.repeat(level), ' ', element._);
      case 'heading':
        sb.removeLastIf(' ');
        return write('#'.repeat(Number(element.$.level || 0)), ' ', element.$$);
      case 'hruler':
        return write('---');
      case 'ref':
        return refLink(element);
      case 'ulink':
        return link(toMarkdown(element.$$), element.$.url);
      case 'xreftitle':
        return write('**', element.$$, ':** ');
      case 'row':
        write('\n', escapeRow(toMarkdown(element.$$, linkResolver)));
        if ((element.$$[0] as DoxDescriptionElement).$.thead === 'yes') {
          element.$$.forEach((_, i) => {
            write(i ? ' | ' : '\n', '---------');
          });
        }
        break;
      case 'entry':
        return write(escapeCell(toMarkdown(element.$$, linkResolver)), '|');
      case 'anchor':
      case 'highlight':
      case 'table':
      case 'parameterdescription':
      case 'parameternamelist':
      case 'xrefdescription':
      case 'verbatim':
      case undefined:
        return write(element.$$);

      default:
        log.warning(`[element[['#name'=${element['#name']}]]]: not supported.`);
    }
  }