@@ -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