atom/atom.go

60 lines
1.3 KiB
Go

package atomfeed
import (
"mime"
"net/url"
"regexp"
"strings"
)
type (
EmailAddress string
LanguageTag string
MediaType string
URI string
)
func isValidURL(uri URI) bool {
_, err := url.ParseRequestURI(string(uri))
return err == nil
}
func isValidURN(uri URI) bool {
pattern := `\A(?i:urn:(?!urn:)(?<nid>[a-z0-9][a-z0-9-]{1,31}):(?<nss>(?:[-a-z0-9()+,.:=@;$_!*'&~\/]|%[0-9a-f]{2})+)(?:\?\+(?<rcomponent>.*?))?(?:\?=(?<qcomponent>.*?))?(?:#(?<fcomponent>.*?))?)\z`
return regexp.MustCompile(pattern).MatchString(string(uri))
}
func isValidURI(uri URI) bool {
return isValidURL(uri) || isValidURN(uri)
}
func isCorrectlyEscaped(text string) bool {
relevantEntities := []string{"&amp;", "&lt;", "&gt;", "&quot;", "&apos;"}
for _, entity := range relevantEntities {
if strings.Contains(text, entity) {
return false
}
}
return true
}
func isCompositeMediaType(mediaType string) bool {
mediaType, _, err := mime.ParseMediaType(mediaType)
if err != nil {
return false
}
return strings.HasPrefix(mediaType, "multipart/") || strings.HasPrefix(mediaType, "message/")
}
func isXMLMediaType(mediaType string) bool {
mediaType, _, err := mime.ParseMediaType(mediaType)
if err != nil {
return false
}
return strings.HasSuffix(mediaType, "/xml") || strings.HasSuffix(mediaType, "+xml")
}