public function filter()

in src/MarkdownExt/AutoLinkifyFilter.hack [34:107]


  public function filter(
    Markdown\RenderContext $context,
    Markdown\ASTNode $node,
  ): vec<Markdown\ASTNode> {
    if (!$node is CodeSpan) {
      return vec[$node];
    }

    if (C\contains($this->seen, $node)) {
      return vec[$node];
    }
    $this->seen[] = $node;

    $content = $node->getCode();

    if ($content === '') {
      return vec[$node];
    }

    if (Str\starts_with($content, '$')) {
      return vec[$node];
    }

    invariant(
      $context is RenderContext,
      'Expected render context to be a %s',
      RenderContext::class,
    );
    $name = $context->getDocumentable()['definition']->getName();

    $words = Str\split($content, ' ');
    $definition = C\firstx($words);

    $leading = '';
    $trailing = Vec\drop($words, 1) |> Str\join($$, ' ');
    if ($trailing !== '') {
      $trailing = ' '.$trailing;
    }

    if (Str\starts_with($definition, '?')) {
      $leading = '?';
      $definition = Str\slice($definition, 1);
    }

    if (!\preg_match('/^[a-zA-Z\\\\]/', $definition)) {
      return vec[$node];
    }

    if (Str\ends_with($name, $definition)) {
      return vec[$node];
    }

    $path = self::getPath(
      $context,
      $definition,
    );

    if ($path === null) {
      return vec[$node];
    }

    $inner = new CodeSpan($definition);
    $this->seen[] = $inner;

    $ret = vec[];
    if ($leading !== '') {
      $ret[] = new CodeSpan($leading);
    }
    $ret[] = new Link(vec[$inner], $path, null);
    if ($trailing !== '') {
      $ret[] = new CodeSpan($trailing);
    }
    return $ret;
  }