mirror of https://github.com/mindoc-org/mindoc.git
实现导出Markdown源文件
parent
13b9e1a1cb
commit
34654ed4d4
|
@ -860,7 +860,6 @@ func (c *DocumentController) Content() {
|
||||||
// 导出
|
// 导出
|
||||||
func (c *DocumentController) Export() {
|
func (c *DocumentController) Export() {
|
||||||
c.Prepare()
|
c.Prepare()
|
||||||
c.TplName = "document/export.tpl"
|
|
||||||
|
|
||||||
identify := c.Ctx.Input.Param(":key")
|
identify := c.Ctx.Input.Param(":key")
|
||||||
if identify == "" {
|
if identify == "" {
|
||||||
|
@ -896,6 +895,21 @@ func (c *DocumentController) Export() {
|
||||||
bookResult.Cover = c.BaseUrl() + bookResult.Cover
|
bookResult.Cover = c.BaseUrl() + bookResult.Cover
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if output == "markdown" {
|
||||||
|
if bookResult.Editor != "markdown"{
|
||||||
|
c.ShowErrorPage(500,"当前项目不支持Markdown编辑器")
|
||||||
|
}
|
||||||
|
p,err := bookResult.ExportMarkdown(c.CruSession.SessionID())
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
c.ShowErrorPage(500,"导出文档失败")
|
||||||
|
}
|
||||||
|
c.Ctx.Output.Download(p, bookResult.BookName+".zip")
|
||||||
|
|
||||||
|
c.StopRun()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
eBookResult, err := bookResult.Converter(c.CruSession.SessionID())
|
eBookResult, err := bookResult.Converter(c.CruSession.SessionID())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"github.com/lifei6671/mindoc/utils/pagination"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"math"
|
"math"
|
||||||
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ManagerController struct {
|
type ManagerController struct {
|
||||||
|
@ -297,7 +298,9 @@ func (c *ManagerController) Books() {
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
for i,book := range books {
|
||||||
|
books[i].Description = utils.StripTags(string(blackfriday.Run([]byte(book.Description))))
|
||||||
|
}
|
||||||
c.Data["Lists"] = books
|
c.Data["Lists"] = books
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/lifei6671/mindoc/converter"
|
"github.com/lifei6671/mindoc/converter"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
"gopkg.in/russross/blackfriday.v2"
|
"gopkg.in/russross/blackfriday.v2"
|
||||||
|
"github.com/lifei6671/mindoc/utils/ziptil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BookResult struct {
|
type BookResult struct {
|
||||||
|
@ -360,3 +361,104 @@ func (m *BookResult) Converter(sessionId string) (ConvertBookResult, error) {
|
||||||
|
|
||||||
return convertBookResult, nil
|
return convertBookResult, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//导出Markdown原始文件
|
||||||
|
func (m *BookResult) ExportMarkdown(sessionId string)(string, error){
|
||||||
|
outputPath := filepath.Join(conf.WorkingDirectory,"uploads","books", strconv.Itoa(m.BookId), "book.zip")
|
||||||
|
|
||||||
|
os.MkdirAll(filepath.Dir(outputPath),0644)
|
||||||
|
|
||||||
|
tempOutputPath := filepath.Join(os.TempDir(),sessionId,"markdown")
|
||||||
|
|
||||||
|
defer os.RemoveAll(tempOutputPath)
|
||||||
|
|
||||||
|
err := exportMarkdown(tempOutputPath,0,m.BookId)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "",err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ziptil.Compress(outputPath,tempOutputPath);err != nil {
|
||||||
|
beego.Error("导出Markdown失败=>",err)
|
||||||
|
return "",err
|
||||||
|
}
|
||||||
|
return outputPath,nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func exportMarkdown(p string,parentId int,bookId int) (error){
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
var docs []*Document
|
||||||
|
|
||||||
|
_,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("book_id",bookId).Filter("parent_id",parentId).All(&docs)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
beego.Error("导出Markdown失败=>",err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _,doc := range docs {
|
||||||
|
//获取当前文档的子文档数量,如果数量不为0,则将当前文档命名为READMD.md并设置成目录。
|
||||||
|
subDocCount,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("parent_id",doc.DocumentId).Count()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
beego.Error("导出Markdown失败=>",err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var docPath string
|
||||||
|
|
||||||
|
if subDocCount > 0 {
|
||||||
|
if doc.Identify != "" {
|
||||||
|
docPath = filepath.Join(p, doc.Identify,"README.md")
|
||||||
|
} else {
|
||||||
|
docPath = filepath.Join(p, strconv.Itoa(doc.DocumentId),"README.md")
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if doc.Identify != "" {
|
||||||
|
docPath = filepath.Join(p, doc.Identify + ".md")
|
||||||
|
} else {
|
||||||
|
docPath = filepath.Join(p, doc.DocumentName + ".md")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dirPath := filepath.Dir(docPath);
|
||||||
|
|
||||||
|
os.MkdirAll(dirPath,0766)
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(docPath,[]byte(doc.Markdown),0644);err != nil {
|
||||||
|
beego.Error("导出Markdown失败=>",err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if subDocCount > 0 {
|
||||||
|
if err = exportMarkdown(dirPath,doc.DocumentId,bookId);err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -87,10 +87,10 @@ func Zip(dest string, filepath ...string) (err error) {
|
||||||
if fw, err := w.Create(strings.TrimLeft(file.Path, "./")); err != nil {
|
if fw, err := w.Create(strings.TrimLeft(file.Path, "./")); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
if filecontent, err := ioutil.ReadFile(file.Path); err != nil {
|
if fileContent, err := ioutil.ReadFile(file.Path); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
if _, err = fw.Write(filecontent); err != nil {
|
if _, err = fw.Write(fileContent); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,3 +99,81 @@ func Zip(dest string, filepath ...string) (err error) {
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Compress(dst string,src string) (err error) {
|
||||||
|
d, _ := os.Create(dst)
|
||||||
|
defer d.Close()
|
||||||
|
w := zip.NewWriter(d)
|
||||||
|
defer w.Close()
|
||||||
|
|
||||||
|
src = strings.Replace(src,"\\","/",-1)
|
||||||
|
f, err := os.Open(src)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//prefix := src[strings.LastIndex(src,"/"):]
|
||||||
|
|
||||||
|
err = compress(f, "", w)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func compress(file *os.File, prefix string, zw *zip.Writer) error {
|
||||||
|
info, err := file.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if info.IsDir() {
|
||||||
|
if prefix != "" {
|
||||||
|
prefix = prefix + "/" + info.Name()
|
||||||
|
}else{
|
||||||
|
prefix = info.Name()
|
||||||
|
}
|
||||||
|
fileInfos, err := file.Readdir(-1)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, fi := range fileInfos {
|
||||||
|
f, err := os.Open(file.Name() + "/" + fi.Name())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = compress(f, prefix, zw)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header, err := zip.FileInfoHeader(info)
|
||||||
|
if prefix != "" {
|
||||||
|
header.Name = prefix + "/" + header.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
writer, err := zw.CreateHeader(header)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = io.Copy(writer, file)
|
||||||
|
file.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,9 @@
|
||||||
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "epub"}}" target="_blank">EPUB</a> </li>
|
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "epub"}}" target="_blank">EPUB</a> </li>
|
||||||
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "mobi"}}" target="_blank">MOBI</a> </li>
|
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "mobi"}}" target="_blank">MOBI</a> </li>
|
||||||
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "docx"}}" target="_blank">Word</a> </li>
|
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "docx"}}" target="_blank">Word</a> </li>
|
||||||
|
{{if eq .Model.Editor "markdown"}}
|
||||||
|
<li><a href="{{urlfor "DocumentController.Export" ":key" .Model.Identify "output" "markdown"}}" target="_blank">Markdown</a> </li>
|
||||||
|
{{end}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
Loading…
Reference in New Issue