@@ -11,48 +11,98 @@ import (
1111)
1212
1313// 定义一个访问者结构体 
14- type  Visitor  struct   {}
14+ type  Visitor  struct {}
1515
16- func  (self  * Visitor ) visit (path  string , f  os.FileInfo , err  error ) error  {
17- 	if  f  ==  nil  {
18- 		return  err 
19- 	}
20- 	if  f .IsDir () {
21- 		return  nil 
22- 	} else  if  (f .Mode () &  os .ModeSymlink ) >  0  {
23- 		return  nil 
24- 	} else  {
25- 		if  strings .HasSuffix (f .Name (), ".md" ) {
26- 			fmt .Println (f )
27- 			file , err  :=  os .Open (f .Name ())
28- 			if  err  !=  nil  {
29- 				return  err 
30- 			}
31- 			input , _  :=  ioutil .ReadAll (file )
32- 			input  =  regexp .MustCompile ("\\ [(.*?)\\ ]\\ (<?(.*?)\\ .md>?\\ )" ).ReplaceAll (input , []byte ("[$1](<$2.html>)" ))
33- 			var  out  * os.File 
34- 			if  out , err  =  os .Create (strings .Replace (f .Name (), ".md" , ".html" , - 1 )); err  !=  nil  {
35- 				fmt .Fprintf (os .Stderr , "Error creating %s: %v" , f .Name (), err )
36- 				os .Exit (- 1 )
37- 			}
38- 			defer  out .Close ()
39- 			md  :=  md2min .New ("none" )
40- 			err  =  md .Parse (input , out )
41- 			if  err  !=  nil  {
42- 				fmt .Fprintln (os .Stderr , "Parsing Error" , err )
43- 				os .Exit (- 1 )
44- 			}
16+ func  (self  * Visitor ) md2html (arg  map [string ]string ) error  {
17+ 	from  :=  arg ["from" ]
18+ 	to  :=  arg ["to" ]
19+ 	err  :=  filepath .Walk (from + "/" , func (path  string , f  os.FileInfo , err  error ) error  {
20+ 		if  f  ==  nil  {
21+ 			return  err 
22+ 		}
23+ 		if  f .IsDir () {
24+ 			return  nil 
25+ 		}
26+ 		if  (f .Mode () &  os .ModeSymlink ) >  0  {
27+ 			return  nil 
28+ 		}
29+ 		if  ! strings .HasSuffix (f .Name (), ".md" ) {
30+ 			return  nil 
31+ 		}
32+ 
33+ 		file , err  :=  os .Open (path )
34+ 		if  err  !=  nil  {
35+ 			return  err 
36+ 		}
37+ 
38+ 		input_byte , _  :=  ioutil .ReadAll (file )
39+ 		input  :=  string (input_byte )
40+ 		input  =  regexp .MustCompile (`\[(.*?)\]\(<?(.*?)\.md>?\)` ).ReplaceAllString (input , "[$1](<$2.html>)" )
41+ 
42+ 		if  f .Name () ==  "README.md"  {
43+ 			input  =  regexp .MustCompile (`https:\/\/github\.com\/astaxie\/build-web-application-with-golang\/blob\/master\/` ).ReplaceAllString (input , "" )
44+ 		}
45+ 
46+ 		// 以#开头的行,在#后增加空格 
47+ 		// 以#开头的行, 删除多余的空格 
48+ 		input  =  FixHeader (input )
49+ 
50+ 		// 删除页面链接 
51+ 		input  =  RemoveFooterLink (input )
52+ 
53+ 		var  out  * os.File 
54+ 		filename  :=  strings .Replace (f .Name (), ".md" , ".html" , - 1 )
55+ 		fmt .Println (to  +  "/"  +  filename )
56+ 		if  out , err  =  os .Create (to  +  "/"  +  filename ); err  !=  nil  {
57+ 			fmt .Fprintf (os .Stderr , "Error creating %s: %v" , f .Name (), err )
58+ 			os .Exit (- 1 )
59+ 		}
60+ 		defer  out .Close ()
61+ 		md  :=  md2min .New ("none" )
62+ 		err  =  md .Parse ([]byte (input ), out )
63+ 		if  err  !=  nil  {
64+ 			fmt .Fprintln (os .Stderr , "Parsing Error" , err )
65+ 			os .Exit (- 1 )
4566		}
67+ 
68+ 		return  nil 
69+ 	})
70+ 	return  err 
71+ }
72+ 
73+ func  FixHeader (input  string ) string  {
74+ 	re_header  :=  regexp .MustCompile (`(?m)^#.+$` )
75+ 	re_sub  :=  regexp .MustCompile (`^(#+)\s*(.+)$` )
76+ 	fixer  :=  func (header  string ) string  {
77+ 		s  :=  re_sub .FindStringSubmatch (header )
78+ 		return  s [1 ] +  " "  +  s [2 ]
4679	}
47- 	return  nil 
80+ 	return  re_header .ReplaceAllStringFunc (input , fixer )
81+ }
82+ 
83+ func  RemoveFooterLink (input  string ) string  {
84+ 	re_footer  :=  regexp .MustCompile (`(?m)^#{2,} links.*?\n(.+\n)*` )
85+ 	return  re_footer .ReplaceAllString (input , "" )
4886}
4987
5088func  main () {
51- 	v  :=  & Visitor {}
52- 	err  :=  filepath .Walk ("./" , func (path  string , f  os.FileInfo , err  error ) error  {
53- 		return  v .visit (path , f , err )
54- 	})
89+ 	tmp  :=  os .Getenv ("TMP" )
90+ 	if  tmp  ==  ""  {
91+ 		tmp  =  "." 
92+ 	}
93+ 
94+ 	workdir  :=  os .Getenv ("WORKDIR" )
95+ 	if  workdir  ==  ""  {
96+ 		workdir  =  "." 
97+ 	}
5598
99+ 	arg  :=  map [string ]string {
100+ 		"from" : workdir ,
101+ 		"to" :   tmp ,
102+ 	}
103+ 
104+ 	v  :=  & Visitor {}
105+ 	err  :=  v .md2html (arg )
56106	if  err  !=  nil  {
57107		fmt .Printf ("filepath.Walk() returned %v\n " , err )
58108	}
0 commit comments