# File lib/html5/filters/rfc3987.rb, line 39
def is_valid_uri(value, uri_pattern = RFC2396)
  scheme = value.split(':').first
  scheme.downcase! if scheme
  if scheme == 'tag'
    if !TAG.match(value)
      return false, "invalid-tag-uri"
    end
  elsif scheme == "urn"
    if !URN.match(value)
      return false, "invalid-urn"
    end
  elsif uri_pattern.match(value).to_a.reject{|i| i == ''}.compact.length == 0 || uri_pattern.match(value)[0] != value
    urichars = Regexp.new("^[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%,#]$", Regexp::MULTILINE)
    if value.length > 0
      value.each_byte do |b|
        if b < 128 and !urichars.match([b].pack('c*'))
          return false, "invalid-uri-char"
        end
      end
    else
      begin
        if uri_pattern.match(value.encode('idna'))
          return false, "uri-not-iri"
        end
      rescue
      end
      return false, "invalid-uri"
    end
  elsif ['http','ftp'].include?(scheme)
    if !value.match(%r{^\w+://[^/].*})
      return false, "invalid-http-or-ftp-uri"
    end
  elsif value.index(':') && scheme.match(/^[a-z]+$/) && !ALLOWED_SCHEMES.include?(scheme)
    return false, "invalid-scheme"
  end
  return true, ""
end