@@ -11,48 +11,98 @@ import (
11
11
)
12
12
13
13
// 定义一个访问者结构体
14
- type Visitor struct {}
14
+ type Visitor struct {}
15
15
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 )
45
66
}
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 ]
46
79
}
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 , "" )
48
86
}
49
87
50
88
func 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
+ }
55
98
99
+ arg := map [string ]string {
100
+ "from" : workdir ,
101
+ "to" : tmp ,
102
+ }
103
+
104
+ v := & Visitor {}
105
+ err := v .md2html (arg )
56
106
if err != nil {
57
107
fmt .Printf ("filepath.Walk() returned %v\n " , err )
58
108
}
0 commit comments