From cfd468ca2c724277e53544fc5eebcff218907d60 Mon Sep 17 00:00:00 2001 From: David Howden Date: Mon, 10 Aug 2015 09:26:09 +1000 Subject: [PATCH] Update ConvertDoc and ConvertDocx to return errors. --- doc.go | 13 +++++++---- docconv.go | 4 ++-- docx.go | 63 ++++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/doc.go b/doc.go index eede6e8..71097f9 100644 --- a/doc.go +++ b/doc.go @@ -13,11 +13,10 @@ import ( ) // Convert MS Word DOC -func ConvertDoc(r io.Reader) (string, map[string]string) { +func ConvertDoc(r io.Reader) (string, map[string]string, error) { f, err := NewLocalFile(r, "/tmp", "sajari-convert-") if err != nil { - log.Println("error creating local file:", err) - return "", nil + return "", nil, fmt.Errorf("error creating local file: %v", err) } defer f.Done() @@ -27,6 +26,7 @@ func ConvertDoc(r io.Reader) (string, map[string]string) { meta := make(map[string]string) metaStr, err := exec.Command("wvSummary", f.Name()).Output() if err != nil { + // TODO: Remove this. log.Println("wvSummary:", err) } @@ -60,6 +60,7 @@ func ConvertDoc(r io.Reader) (string, map[string]string) { // Save output to a file outputFile, err := ioutil.TempFile("/tmp", "sajari-convert-") if err != nil { + // TODO: Remove this. log.Println("TempFile Out:", err) return } @@ -67,24 +68,28 @@ func ConvertDoc(r io.Reader) (string, map[string]string) { err = exec.Command("wvText", f.Name(), outputFile.Name()).Run() if err != nil { + // TODO: Remove this. log.Println("wvText:", err) } var buf bytes.Buffer _, err = buf.ReadFrom(outputFile) if err != nil { + // TODO: Remove this. log.Println("wvText:", err) } bc <- buf.String() }() + // TODO: Should errors in either of the above Goroutines stop things from progressing? body := <-bc meta := <-mc + // TODO: Check for errors instead of len(body) == 0? if len(body) == 0 { f.Seek(0, 0) return ConvertDocx(f) } - return body, meta + return body, meta, nil } diff --git a/docconv.go b/docconv.go index a5dbe7e..32622b7 100644 --- a/docconv.go +++ b/docconv.go @@ -67,10 +67,10 @@ func convert(r io.Reader, mimeType string, readability bool) *Response { var err error switch mimeType { case "application/msword", "application/vnd.ms-word": - body, meta = ConvertDoc(r) + body, meta, err = ConvertDoc(r) case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": - body, meta = ConvertDocx(r) + body, meta, err = ConvertDocx(r) case "application/vnd.oasis.opendocument.text": body, meta = ConvertODT(r) diff --git a/docx.go b/docx.go index 69d3668..f26507b 100644 --- a/docx.go +++ b/docx.go @@ -6,25 +6,22 @@ import ( "fmt" "io" "io/ioutil" - "log" "regexp" "time" ) // Convert DOCX to text -func ConvertDocx(r io.Reader) (string, map[string]string) { +func ConvertDocx(r io.Reader) (string, map[string]string, error) { meta := make(map[string]string) var textHeader, textBody, textFooter string b, err := ioutil.ReadAll(r) if err != nil { - log.Println("ioutil.ReadAll:", err) - return "", nil + return "", nil, err } zr, err := zip.NewReader(bytes.NewReader(b), int64(len(b))) if err != nil { - log.Println("zip.NewReader:", err) - return "", nil + return "", nil, fmt.Errorf("error unzipping data: %v", err) } // Regular expression for XML files to include in the text parsing @@ -33,9 +30,17 @@ func ConvertDocx(r io.Reader) (string, map[string]string) { for _, f := range zr.File { if f.Name == "docProps/core.xml" { - rc, _ := f.Open() + rc, err := f.Open() + if err != nil { + return "", nil, fmt.Errorf("error opening '%v' from archive: %v", f.Name, err) + } defer rc.Close() - info, _ := XMLToMap(rc) + + info, err := XMLToMap(rc) + if err != nil { + return "", nil, fmt.Errorf("error parsing '%v': %v", f.Name, err) + } + if tmp, ok := info["modified"]; ok { if t, err := time.Parse(time.RFC3339, tmp); err == nil { meta["ModifiedDate"] = fmt.Sprintf("%d", t.Unix()) @@ -47,24 +52,46 @@ func ConvertDocx(r io.Reader) (string, map[string]string) { } } } else if f.Name == "word/document.xml" { - rc, _ := f.Open() + rc, err := f.Open() + if err != nil { + return "", nil, fmt.Errorf("error opening '%v' from archive: %v", f.Name, err) + } defer rc.Close() - textBody = DocxXMLToText(rc) + + textBody, err = DocxXMLToText(rc) + if err != nil { + return "", nil, fmt.Errorf("error parsing '%v': %v", f.Name, err) + } } else if reHeaderFile.MatchString(f.Name) { - rc, _ := f.Open() + rc, err := f.Open() + if err != nil { + return "", nil, fmt.Errorf("error opening '%v' from archive: %v", f.Name, err) + } defer rc.Close() - textHeader += DocxXMLToText(rc) + "\n" + + header, err := DocxXMLToText(rc) + if err != nil { + return "", nil, fmt.Errorf("error parsing header file '%v': %v", f.Name, err) + } + textHeader += header + "\n" } else if reFooterFile.MatchString(f.Name) { - rc, _ := f.Open() + rc, err := f.Open() + if err != nil { + return "", nil, fmt.Errorf("error opening '%v' from archive: %v", f.Name, err) + } defer rc.Close() - textFooter += DocxXMLToText(rc) + "\n" + + footer, err := DocxXMLToText(rc) + if err != nil { + return "", nil, fmt.Errorf("error parsing footer file '%v': %v", f.Name, err) + } + textFooter += footer + "\n" } } - return textHeader + "\n" + textBody + "\n" + textFooter, meta + return textHeader + "\n" + textBody + "\n" + textFooter, meta, nil } -func DocxXMLToText(r io.Reader) string { - result, _ := XMLToText(r, []string{"br", "p", "tab"}, []string{"instrText", "script"}, true) - return result +func DocxXMLToText(r io.Reader) (string, error) { + return XMLToText(r, []string{"br", "p", "tab"}, []string{"instrText", "script"}, true) }