forked from b3log/pipe
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exportsrv.go
80 lines (66 loc) · 2.22 KB
/
exportsrv.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Pipe - A small and beautiful blogging platform written in golang.
// Copyright (C) 2017-2018, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package service
import (
"regexp"
"strings"
"github.com/b3log/pipe/model"
"gopkg.in/yaml.v2"
)
// Export service.
var Export = &exportService{}
type exportService struct {
}
func (srv *exportService) ExportMarkdowns(blogID uint64) (ret []*MarkdownFile) {
var articles []*model.Article
if err := db.Where("`blog_id` = ?", blogID).Find(&articles).Error; nil != err {
logger.Errorf("export markdowns failed: " + err.Error())
return
}
if 1 > len(articles) {
return
}
for _, article := range articles {
front := struct {
Title string `yaml:"title"`
Date string `yaml:"date"`
Updated string `yaml:"updated"`
Tags []string `yaml:"tags"`
Permalink string `yaml:"permalink"`
}{
article.Title,
article.CreatedAt.Format("2006-01-02 15:04:05"),
article.UpdatedAt.Format("2006-01-02 15:04:05"),
strings.Split(article.Tags, ","),
article.Path,
}
frontData, err := yaml.Marshal(front)
if nil != err {
logger.Errorf("marshal front matter failed: " + err.Error())
continue
}
mdFile := &MarkdownFile{
Name: sanitizeFilename(article.Title),
Content: string(frontData) + "---\n" + article.Content,
}
ret = append(ret, mdFile)
}
return ret
}
func sanitizeFilename(unsanitized string) string {
unsanitized = regexp.MustCompile("[\\?\\\\/:|<>\\*]").ReplaceAllString(unsanitized, " ") // filter out ? \ / : | < > *
return regexp.MustCompile("\\s+").ReplaceAllString(unsanitized, "_") // white space as underscores
}