package main import ( "regexp" "strings" "time" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" ) // An AlbumState describe the state of an Album type AlbumState int const ( NEW AlbumState = iota // 0 MINT // 1 GOOD // 2 AVERAGE // 3 BAD // 4 ) // An Album is the core object in our system // // This is basically the data we store on bdgest.com, and that we want // in our system to be retrieve from type Album struct { ID uint64 ISBN string Series string Title string Num int NumA string State AlbumState Author string Editor string Collection string SatID string LegalDeposit time.Time PrintDate time.Time } var endDelim = regexp.MustCompile(` \(.*\)\z`) var wordBoundaries = regexp.MustCompile(`[^[:alnum:]]+`) var punctuation = regexp.MustCompile(`[!?\.:;,]`) func sanitizeTitleString(title string, removeEndParent bool) string { // first sanitize accuented characters. isOk := func(r rune) bool { return r < 32 || r >= 127 } // The isOk filter is such that there is no need to chain to norm.NFC t := transform.Chain(norm.NFKD, transform.RemoveFunc(isOk)) // This Transformer could also trivially be applied as an io.Reader // or io.Writer filter to automatically do such filtering when reading // or writing data anywhere. title, _, _ = transform.String(t, title) //Now we remove all punctuation if removeEndParent == true { title = endDelim.ReplaceAllString(title, "") } return strings.Trim(wordBoundaries.ReplaceAllString(punctuation.ReplaceAllString(title, ""), "-"), "-") } func (*Album) GetBedethequeComURI() string { return "" } // An AlbumDescription is a more complete BD description // // It holds data that can be fetched from bedetheque.com type AlbumDescription struct { Album *Album HasCover bool Description string Note float64 Scenarist string Designer string Colorist string Cycle string Format string Pages int32 Created time.Time }