44 "bufio"
55 "crypto/tls"
66 "flag"
7+ "fmt"
78 "io"
89 "log"
910 "net"
@@ -35,6 +36,7 @@ var localList = []string{
3536func GetList (list []string ) []io.Reader {
3637 bodys := make ([]io.Reader , 0 )
3738 for _ , l := range list {
39+ log .Println ("getting" , l )
3840 resp , err := req .Get (l )
3941 if err != nil {
4042 panic (err )
@@ -102,7 +104,15 @@ func Parase(list map[string]struct{}, writer *bufio.Writer, params []string) {
102104 }
103105}
104106
107+ func deleteStr (newOrg string , strs []string ) string {
108+ for _ , s := range strs {
109+ newOrg = strings .ReplaceAll (newOrg , s , "" )
110+ }
111+ return newOrg
112+ }
113+
105114func Resolve (bodys []io.Reader , list map [string ]struct {}) {
115+ const j = '#'
106116 for _ , body := range bodys {
107117 reader := bufio .NewReader (body )
108118 for {
@@ -111,15 +121,15 @@ func Resolve(bodys []io.Reader, list map[string]struct{}) {
111121 break
112122 }
113123 original := string (o )
114- // 第一个字符为 # 时跳过
115- if strings .IndexRune (original , '# ' ) == 0 {
124+ // 第一个字符为 # 或 ! 时跳过
125+ if strings .IndexRune (original , j ) == 0 || strings . IndexRune ( original , '! ' ) == 0 {
116126 continue
117127 }
118128 // 为空行时跳过
119129 if strings .TrimSpace (original ) == "" {
120130 continue
121131 }
122- // 用于 https://hosts-file.net/ad_servers.txt
132+ // 用于 https://hosts-file.net/ad_servers.txt 等中间包含特殊空格的
123133 if strings .ContainsRune (original , '\t' ) {
124134 original = strings .ReplaceAll (original , "\t " , " " )
125135 }
@@ -132,18 +142,30 @@ func Resolve(bodys []io.Reader, list map[string]struct{}) {
132142 // 移除行中的空格
133143 newOrg = strings .TrimSpace (newOrg )
134144 // 再一次验证第一个字符为 # 时跳过
135- if strings .IndexRune (original , '#' ) == 0 {
145+ if strings .IndexRune (original , j ) == 0 {
136146 continue
137147 }
138- if strings .ContainsRune (newOrg , '#' ) {
139- newOrg = newOrg [:strings .IndexRune (newOrg , '#' )]
148+ if strings .ContainsRune (newOrg , j ) {
149+ newOrg = newOrg [:strings .IndexRune (newOrg , j )]
140150 }
141151 // dnsmasq-list
142- newOrg = strings .ReplaceAll (newOrg , "server=/" , "" )
143- newOrg = strings .ReplaceAll (newOrg , "/114.114.114.114" , "" )
152+ newOrg = deleteStr (newOrg , []string {"server=/" , "/114.114.114.114" })
144153 if ! formatter (newOrg ) {
145154 continue
146155 }
156+ // adblock
157+ if strings .ContainsRune (newOrg , '^' ) {
158+ // 子域名包含 * 的不会被解析
159+ if strings .ContainsRune (newOrg , '*' ) {
160+ continue
161+ }
162+ // 表达式不会被解析
163+ if strings .Contains (newOrg , "/^" ) {
164+ continue
165+ }
166+ // 基础白名单规则会被一同解析
167+ newOrg = deleteStr (newOrg , []string {"||" , "^" , "@@" })
168+ }
147169 newOrg = strings .TrimSpace (newOrg )
148170 // 检测是否有端口号,有则移除端口号
149171 if strings .ContainsRune (newOrg , ':' ) {
@@ -191,8 +213,49 @@ func transport() *http.Transport {
191213 }
192214}
193215
216+ var vals = []string {
217+ dnsmasq , v2ray , hosts , adblock , only ,
218+ }
219+
220+ const (
221+ dnsmasq = "dnsmasq"
222+ v2ray = "v2ray"
223+ hosts = "hosts"
224+ adblock = "adblock"
225+ only = "only"
226+ )
227+
228+ func domainFormat (value , exp string ) []string {
229+ vals := make ([]string , 0 )
230+ switch value {
231+ case dnsmasq :
232+ v := "/114.114.114.114"
233+ if exp != "" {
234+ v = "/" + exp
235+ }
236+ vals = append (vals , "server=/" , v , "server=/" , v )
237+ case v2ray :
238+ vals = append (vals , "full:" , "" , "domain:" , "" )
239+ case adblock :
240+ vals = append (vals , "||" , "^" , "||" , "^" )
241+ case hosts :
242+ v := "0.0.0.0 "
243+ if exp != "" {
244+ v = exp + " "
245+ }
246+ vals = append (vals , v , "" , v , "" )
247+ case only :
248+ vals = append (vals , "" , "" , "" , "" )
249+ default :
250+ panic (fmt .Sprintln (value , " is an unsupported format" ))
251+ }
252+ return vals
253+ }
254+
194255func main () {
195256 file := flag .String ("c" , "" , "" )
257+ val := flag .String ("v" , "" , "" )
258+ exp := flag .String ("e" , "" , "" )
196259 pars := flag .String ("p" , "" , "" )
197260 flag .Parse ()
198261 params = make ([]string , 0 )
@@ -202,6 +265,13 @@ func main() {
202265 log .Println (err )
203266 return
204267 }
268+ if strings .TrimSpace (* val ) != "" {
269+ for _ , v := range vals {
270+ if v == * val {
271+ params = domainFormat (v , strings .TrimSpace (* exp ))
272+ }
273+ }
274+ }
205275 body := bufio .NewReader (f )
206276 domainList := make ([]string , 0 )
207277 for {
0 commit comments