package parser import ( "bufio" "io" "strings" ) func init() { RegisterDomainsParser(adblockDomainsParser{}) } type adblockDomainsParser struct{} func (adblockDomainsParser) CanHandle(line string) bool { return strings.HasPrefix(strings.ToLower(line), `[adblock`) || strings.HasPrefix(line, "@@") || // exception strings.HasPrefix(line, "||") || // blah line[0] == '*' } func (adblockDomainsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) { scanner := bufio.NewScanner(r) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if isComment(line) { continue } // Common AdBlock patterns: // ||domain.com^ // |http://domain.com| // domain.com/path // *domain.com* switch { case strings.HasPrefix(line, `||`): // domain anchor if i := strings.IndexByte(line, '^'); i != -1 { domains = append(domains, line[2:i]) continue } case strings.HasPrefix(line, `|`) && strings.HasSuffix(line, `|`): domains = append(domains, line[1:len(line)-2]) continue case strings.HasPrefix(line, `[`): continue } ignored++ } if err = scanner.Err(); err != nil { return } return unique(domains), ignored, nil }