/*
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights resvered.
*/
package commonmark4cj.commonmark
/**
* Attempt to parse an autolink (URL or email in pointy brackets).
*/
public class AutolinkInlineParser <: InlineContentParser {
private static let URI: Regex = Regex(#"^[a-zA-Z][a-zA-Z0-9.+-]{1,31}:[^<>\x00-\x20]*$"#)
private static let EMAIL: Regex = Regex(
#"^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$"#)
// @Override
public func tryParse(inlineParserState: InlineParserState): ParsedInline {
let scanner: Scanner = inlineParserState.getScanner()
scanner.next()
let textStart: SourcePosition = scanner.position()
if (scanner.find(b'>') > 0) {
let textSource: SourceLines = scanner.getSource(textStart, scanner.position())
let content: String = textSource.getContent()
scanner.next()
var destination: ?String = None
if (URI.matches(content)) {
destination = content
} else if (EMAIL.matches(content)) {
destination = "mailto:" + content
}
if (let Some(destination) <- destination) {
let link: Link = Link(destination, None)
let text: Text = Text(content)
text.setSourceSpans(textSource.getSourceSpans())
link.appendChild(text)
return ParsedInline.of(link, scanner.position())
}
}
return ParsedInline.none()
}
}
public class AutolinkInlineParserFactory <: InlineContentParserFactory {
// @Override
@Frozen
public func getTriggerCharacters(): HashSet<Rune> {
return HashSet(r'<')
}
// @Override
@Frozen
public func create(): InlineContentParser {
return AutolinkInlineParser()
}
}