/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights resvered.
 */
package commonmark4cj.commonmark

/**
 * Parse a backslash-escaped special character, adding either the escaped  character, a hard line break
 * (if the backslash is followed by a newline), or a literal backslash to the block's children.
 */
public class BackslashInlineParser <: InlineContentParser {
    // @Override
    public func tryParse(inlineParserState: InlineParserState): ParsedInline {
        let scanner: Scanner = inlineParserState.getScanner()
        // Backslash
        scanner.next()

        let next = scanner.peek()
        if (next == b'\n') {
            scanner.next()
            return ParsedInline.of(HardLineBreak(), scanner.position())
        } else if (next != b'\0' && isEscapable(next)) {
            scanner.next()
            return ParsedInline.of(Text(Rune(next).toString()), scanner.position())
        } else {
            return ParsedInline.of(Text("\\"), scanner.position())
        }
    }
}

public class BackslashInlineParserFactory <: InlineContentParserFactory {
    // @Override
    @Frozen
    public func getTriggerCharacters(): HashSet<Rune> {
        return HashSet(r'\\')
    }

    // @Override
    @Frozen
    public func create(): InlineContentParser {
        return BackslashInlineParser()
    }
}