In the function updateAttributedString():
endRange = [scanString rangeOfString:endMarker options:options range:remainingRange];
It doesn't check for an escaped endMarker:
if (hasCharacterRelative(scanString, endRange, -1, escapeCharacter)) { continueScan = YES; //scanEndIndex = endRange.location + endRange.length; scanEndIndex = endRange.location + 1; }
Therefore, it will fail to properly parse:
[\(\)](http://apple.com)