Coverage Summary for Class: Scanners (io.heapy.kotmark.autolink.internal)

Class Class, % Method, % Branch, % Line, % Instruction, %
Scanners 100% (1/1) 100% (5/5) 98.9% (93/94) 100% (24/24) 99.6% (232/233)


 // Port of autolink-java 0.12.0. Copyright (c) 2015 Robin Stocker. MIT; see UPSTREAM.md.
 package io.heapy.kotmark.autolink.internal
 
 import io.heapy.kotmark.autolink.LinkSpan
 
 internal fun interface Scanner {
     fun scan(input: CharSequence, triggerIndex: Int, rewindIndex: Int): LinkSpan?
 }
 
 internal object Scanners {
     fun isAlpha(c: Char): Boolean = c in 'A'..'Z' || c in 'a'..'z'
     fun isDigit(c: Char): Boolean = c in '0'..'9'
     fun isAlnum(c: Char): Boolean = isAlpha(c) || isDigit(c)
     fun isNonAscii(c: Char): Boolean = c >= '\u0080'
 
     fun findUrlEnd(input: CharSequence, beginIndex: Int): Int {
         var round = 0
         var square = 0
         var curly = 0
         var singleQuote = false
         var last = -1
         for (i in beginIndex..<input.length) {
             when (input[i]) {
                 // Explicit upstream character set, independent of backend Unicode tables.
                 in '\u0000'..' ', '"', '<', '>', '`', in '\u007F'..'\u00A0',
                 in '\u2000'..'\u200A', '\u2028', '\u2029', '\u202F', '\u205F', '\u3000' -> break
                 '?', '!', '.', ',', ':', ';' -> Unit
                 '/' -> if (last == i - 1) last = i
                 '(' -> round++
                 ')' -> { round--; if (round >= 0) last = i else break }
                 '[' -> square++
                 ']' -> { square--; if (square >= 0) last = i else break }
                 '{' -> curly++
                 '}' -> { curly--; if (curly >= 0) last = i else break }
                 '\'' -> { singleQuote = !singleQuote; if (!singleQuote) last = i }
                 else -> last = i
             }
         }
         return last
     }
 }