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;
}