diff --git a/app/controllers/NoteController.go b/app/controllers/NoteController.go index db105cd..1e029fe 100644 --- a/app/controllers/NoteController.go +++ b/app/controllers/NoteController.go @@ -434,7 +434,7 @@ func (c Note) ExportPdf(noteId string) revel.Result { // path 判断是否需要重新生成之 guid := NewGuid() - fileUrlPath := "files/" + Digest3(noteUserId) + "/" + noteUserId + "/" + Digest2(guid) + "/images/pdf" + fileUrlPath := "files/export_pdf" dir := revel.BasePath + "/" + fileUrlPath if !MkdirAll(dir) { return c.RenderText("error, no dir") @@ -463,9 +463,9 @@ func (c Note) ExportPdf(noteId string) revel.Result { // wkhtmltopdf参数大全 var cc string if note.IsMarkdown { - cc = binPath + " --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" + cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" } else { - cc = binPath + " \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" + cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" } cmd := exec.Command("/bin/sh", "-c", cc) diff --git a/app/controllers/api/ApiNoteController.go b/app/controllers/api/ApiNoteController.go index 176342c..d7254c6 100644 --- a/app/controllers/api/ApiNoteController.go +++ b/app/controllers/api/ApiNoteController.go @@ -8,7 +8,6 @@ import ( "gopkg.in/mgo.v2/bson" "os" "os/exec" - "regexp" "strings" "time" // "github.com/leanote/leanote/app/types" @@ -147,68 +146,10 @@ func (c ApiNote) GetNoteAndContent(noteId string) revel.Result { apiNotes := noteService.ToApiNotes([]info.Note{noteAndContent.Note}) apiNote := apiNotes[0] - apiNote.Content = noteAndContent.Content + apiNote.Content = noteService.FixContent(noteAndContent.Content, noteAndContent.IsMarkdown) return c.RenderJson(apiNote) } -// 处理笔记内容数据 http://leanote.com/file/outputImage -> https://leanote.com/api/file/getImage -// 图片, 附件都替换 -func (c ApiNote) fixContent(content string) string { - // TODO, 这个url需要从config中取 - // baseUrl := "http://leanote.com" - baseUrl := configService.GetSiteUrl() - // baseUrl := "http://localhost:9000" - - patterns := []map[string]string{ - map[string]string{"src": "src", "middle": "/file/outputImage", "param": "fileId", "to": "getImage?fileId="}, - map[string]string{"src": "href", "middle": "/attach/download", "param": "attachId", "to": "getAttach?fileId="}, - map[string]string{"src": "href", "middle": "/attach/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="}, - } - - for _, eachPattern := range patterns { - - // src="http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1" - // href="http://leanote.com/attach/download?attachId=5504243a38f4111dcb00017d" - // href="http://leanote.com/attach/downloadAll?noteId=55041b6a38f4111dcb000159" - - regImage, _ := regexp.Compile(eachPattern["src"] + `=('|")` + baseUrl + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})("|')`) - findsImage := regImage.FindAllStringSubmatch(content, -1) // 查找所有的 - - // [[src='http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" ' 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "]] - for _, eachFind := range findsImage { - // [src='http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" ' 54672e8d38f411286b000069 "] - if len(eachFind) == 4 { - content = strings.Replace(content, - eachFind[0], - eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"", - 1) - } - } - - // markdown处理 - // ![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) - // [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f) - // [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000) - - pre := "!" // 默认图片 - if eachPattern["src"] == "href" { // 是attach - pre = "" - } - - regImageMarkdown, _ := regexp.Compile(pre + `\[(.*?)\]\(` + baseUrl + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`) - findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的 - // [[![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1] [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1]] - for _, eachFind := range findsImageMarkdown { - // [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1] - if len(eachFind) == 3 { - content = strings.Replace(content, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1) - } - } - } - - return content -} - // content里的image, attach链接是 // https://leanote.com/api/file/getImage?fileId=xx // https://leanote.com/api/file/getAttach?fileId=xx @@ -228,12 +169,13 @@ func (c ApiNote) fixPostNotecontent(noteOrContent *info.ApiNote) { } // 得到内容 -// [OK] func (c ApiNote) GetNoteContent(noteId string) revel.Result { + userId := c.getUserId() + note := noteService.GetNote(noteId, userId) // re := info.NewRe() - noteContent := noteService.GetNoteContent(noteId, c.getUserId()) + noteContent := noteService.GetNoteContent(noteId, userId) if noteContent.Content != "" { - noteContent.Content = c.fixContent(noteContent.Content) + noteContent.Content = noteService.FixContent(noteContent.Content, note.IsMarkdown) } apiNoteContent := info.ApiNoteContent{ @@ -242,7 +184,6 @@ func (c ApiNote) GetNoteContent(noteId string) revel.Result { Content: noteContent.Content, } - // re.Item = noteContent return c.RenderJson(apiNoteContent) } @@ -259,7 +200,8 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result { } */ // Log(noteOrContent.Title) - // LogJ(noteOrContent) + // LogJ(noteOrContent) + /* LogJ(c.Params) for name, _ := range c.Params.Files { @@ -625,7 +567,7 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result { // path 判断是否需要重新生成之 guid := NewGuid() - fileUrlPath := "files/" + Digest3(noteUserId) + "/" + noteUserId + "/" + Digest2(guid) + "/images/pdf" + fileUrlPath := "files/export_pdf" dir := revel.BasePath + "/" + fileUrlPath if !MkdirAll(dir) { re.Msg = "noDir" @@ -649,9 +591,9 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result { url := configService.GetSiteUrl() + "/note/toPdf?noteId=" + noteId + "&appKey=" + appKey var cc string if note.IsMarkdown { - cc = binPath + " --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" + cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" } else { - cc = binPath + " \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" + cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" } cmd := exec.Command("/bin/sh", "-c", cc) diff --git a/app/service/NoteService.go b/app/service/NoteService.go index 504fc87..fa06448 100644 --- a/app/service/NoteService.go +++ b/app/service/NoteService.go @@ -5,6 +5,8 @@ import ( "github.com/leanote/leanote/app/info" . "github.com/leanote/leanote/app/lea" "gopkg.in/mgo.v2/bson" + "regexp" + "strings" "time" ) @@ -921,3 +923,187 @@ func (this *NoteService) UpdateNoteToDeleteTag(userId string, targetTag string) } return ret } + +// api + +// 得到笔记的内容, 此时将笔记内的链接转成标准的Leanote Url +// 将笔记的图片, 附件链接转换成 site.url/file/getImage?fileId=xxx, site.url/file/getAttach?fileId=xxxx +func (this *NoteService) FixContentBad(content string, isMarkdown bool) string { + baseUrl := configService.GetSiteUrl() + + baseUrlPattern := baseUrl + + // 避免https的url + if baseUrl[0:8] == "https://" { + baseUrlPattern = strings.Replace(baseUrl, "https://", "https*://", 1) + } else { + baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1) + } + + patterns := []map[string]string{ + map[string]string{"src": "src", "middle": "/file/outputImage", "param": "fileId", "to": "getImage?fileId="}, + map[string]string{"src": "href", "middle": "/attach/download", "param": "attachId", "to": "getAttach?fileId="}, + // 该链接已失效, 不再支持 + map[string]string{"src": "href", "middle": "/attach/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="}, + } + + for _, eachPattern := range patterns { + + if !isMarkdown { + + // 富文本处理 + + // + // + + var reg *regexp.Regexp + if eachPattern["src"] == "src" { + reg, _ = regexp.Compile("]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`) + } else { + reg, _ = regexp.Compile("]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`) + } + + finds := reg.FindAllStringSubmatch(content, -1) // 查找所有的 + + for _, eachFind := range finds { + if len(eachFind) == 3 { + // 这一行会非常慢!, content是全部的内容, 多次replace导致 + content = strings.Replace(content, + eachFind[1], + eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"", + 1) + } + } + } else { + + // markdown处理 + // ![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) + // [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f) + // [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000) + + pre := "!" // 默认图片 + if eachPattern["src"] == "href" { // 是attach + pre = "" + } + + regImageMarkdown, _ := regexp.Compile(pre + `\[([^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`) + findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的 + // [[![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1] [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1]] + for _, eachFind := range findsImageMarkdown { + // [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1] + if len(eachFind) == 3 { + content = strings.Replace(content, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1) + } + } + } + } + + return content +} + +// 性能更好, 5倍的差距 +func (this *NoteService) FixContent(content string, isMarkdown bool) string { + baseUrl := configService.GetSiteUrl() + + baseUrlPattern := baseUrl + + // 避免https的url + if baseUrl[0:8] == "https://" { + baseUrlPattern = strings.Replace(baseUrl, "https://", "https*://", 1) + } else { + baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1) + } + + patterns := []map[string]string{ + map[string]string{"src": "src", "middle": "/file/outputImage", "param": "fileId", "to": "getImage?fileId="}, + map[string]string{"src": "href", "middle": "/attach/download", "param": "attachId", "to": "getAttach?fileId="}, + // 该链接已失效, 不再支持 + map[string]string{"src": "href", "middle": "/attach/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="}, + } + + for _, eachPattern := range patterns { + + if !isMarkdown { + + // 富文本处理 + + // + // + + var reg *regexp.Regexp + var reg2 *regexp.Regexp + if eachPattern["src"] == "src" { + reg, _ = regexp.Compile("]+?)(?:" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=(?:[a-z0-9A-Z]{24})["']*)[^>]*>`) + reg2, _ = regexp.Compile("]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`) + } else { + reg, _ = regexp.Compile("]+?)(?:" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=(?:[a-z0-9A-Z]{24})["']*)[^>]*>`) + reg2, _ = regexp.Compile("]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`) + } + + content = reg.ReplaceAllStringFunc(content, func(str string) string { + // str=这样的 + // + + eachFind := reg2.FindStringSubmatch(str) + str = strings.Replace(str, + eachFind[1], + eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"", + 1) + + // fmt.Println(str) + return str + }) + /* + finds := reg.FindAllStringSubmatch(content, -1) // 查找所有的 + + for _, eachFind := range finds { + if len(eachFind) == 3 { + // 这一行会非常慢!, content是全部的内容, 多次replace导致 + content = strings.Replace(content, + eachFind[1], + eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"", + 1) + } + } + */ + } else { + + // markdown处理 + // ![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) + // [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f) + // [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000) + + pre := "!" // 默认图片 + if eachPattern["src"] == "href" { // 是attach + pre = "" + } + + regImageMarkdown, _ := regexp.Compile(pre + `\[(?:[^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=(?:[a-z0-9A-Z]{24})\)`) + regImageMarkdown2, _ := regexp.Compile(pre + `\[([^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`) + + content = regImageMarkdown.ReplaceAllStringFunc(content, func(str string) string { + // str=这样的 + // + + eachFind := regImageMarkdown2.FindStringSubmatch(str) + str = strings.Replace(str, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1) + + // fmt.Println(str) + return str + }) + + /* + findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的 + // [[![](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1] [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 5503537b38f4111dcb0000d1]] + for _, eachFind := range findsImageMarkdown { + // [![你好啊, 我很好, 为什么?](http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1) 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1] + if len(eachFind) == 3 { + content = strings.Replace(content, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1) + } + } + */ + } + } + + return content +}