Coverage Summary for Class: UrlScanner (io.heapy.kotmark.autolink.internal)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| UrlScanner |
100%
(1/1)
|
100%
(3/3)
|
96.4%
(27/28)
|
100%
(16/16)
|
100%
(108/108)
|
// 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
import io.heapy.kotmark.autolink.LinkType
internal class UrlScanner : Scanner {
override fun scan(input: CharSequence, triggerIndex: Int, rewindIndex: Int): LinkSpan? {
val afterSlashSlash = triggerIndex + 3
if (afterSlashSlash >= input.length || input[triggerIndex + 1] != '/' || input[triggerIndex + 2] != '/') return null
val first = findFirst(input, triggerIndex - 1, rewindIndex)
if (first == -1) return null
val last = Scanners.findUrlEnd(input, afterSlashSlash)
return if (last == -1) null else LinkSpanImpl(LinkType.URL, first, last + 1)
}
private fun findFirst(input: CharSequence, beginIndex: Int, rewindIndex: Int): Int {
var first = -1
var digit = -1
for (i in beginIndex downTo rewindIndex) {
val c = input[i]
when {
Scanners.isAlpha(c) -> first = i
Scanners.isDigit(c) -> digit = i
c != '+' && c != '-' && c != '.' -> break
}
}
// Do not extract abc://foo from 1abc://foo; leading punctuation is allowed.
return if (first > 0 && first - 1 == digit) -1 else first
}
}