Skip to content

Commit

Permalink
temp
Browse files Browse the repository at this point in the history
  • Loading branch information
quickstar committed Nov 26, 2023
1 parent 1ecfe31 commit c42117f
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 15 deletions.
19 changes: 18 additions & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
]
},
{
"name": "Launch example",
"name": "Launch letter odt example",
"type": "go",
"request": "launch",
"mode": "debug",
Expand All @@ -35,6 +35,23 @@
"-m",
"examples/letter.yaml",
]
},
{
"name": "Launch letter docx example",
"type": "go",
"request": "launch",
"mode": "debug",
"cwd": "${workspaceFolder}",
"program": "${workspaceFolder}/main.go",
"args": [
"template",
"-t",
"examples/letter.docx",
"-o",
"dist/letter.docx",
"-m",
"examples/letter.yaml",
]
}
]
}
Binary file added examples/letter.docx
Binary file not shown.
83 changes: 73 additions & 10 deletions internal/document/odf.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ package document
import (
"fmt"
"io"
"io/ioutil"

"github.com/djboris9/xmltree"

Check failure on line 7 in internal/document/odf.go

View workflow job for this annotation

GitHub Actions / lint

import 'github.com/djboris9/xmltree' is not allowed from list 'Main' (depguard)

Check failure on line 7 in internal/document/odf.go

View workflow job for this annotation

GitHub Actions / lint

import 'github.com/djboris9/xmltree' is not allowed from list 'Main' (depguard)
"github.com/microfast-ch/rea/internal/odf"
"github.com/microfast-ch/rea/internal/ooxml"
"github.com/microfast-ch/rea/internal/utils"
)

// processOdf processes the ODF specific entities for current PackagedDocument.
// The PackagedDocument must be of type *odf.Odf.
func (p *PackagedDocument) processOdf(model *Model, out io.Writer) (*ProcessingData, error) {
tmpl, ok := p.doc.(*odf.Odf)
func (p *PackagedDocument) processOoxml(model *Model, out io.Writer) (*ProcessingData, error) {
tmpl, ok := p.doc.(*ooxml.OOXML)
if !ok {
return nil, fmt.Errorf("%w: processOdf called on non ODF document of type %T", ErrUnknownType, p.doc)
}
Expand All @@ -22,7 +22,7 @@ func (p *PackagedDocument) processOdf(model *Model, out io.Writer) (*ProcessingD
TemplateMimeType: tmpl.MIMEType(),
}

xmlTree, err := getODFContent(tmpl)
xmlTree, err := getOOXMLContent(tmpl)
if err != nil {
return templateData, err
}
Expand All @@ -34,11 +34,8 @@ func (p *PackagedDocument) processOdf(model *Model, out io.Writer) (*ProcessingD

// Write file, overriding mimetype and content.xml
// TODO: Override/Delete thumbnail and remove it from the manifest.xml
ov := odf.Overrides{
"mimetype": odf.Override{
Data: []byte("application/vnd.oasis.opendocument.text"),
},
"content.xml": odf.Override{
ov := ooxml.Overrides{
"word/document.xml": ooxml.Override{
Data: []byte(templateData.XMLResult),
},
}
Expand All @@ -51,6 +48,31 @@ func (p *PackagedDocument) processOdf(model *Model, out io.Writer) (*ProcessingD
return templateData, nil
}

// getODFContent returns the ODF specific content.xml as XMLTree.
func getOOXMLContent(tmpl *ooxml.OOXML) (*xmltree.Node, error) {
// Check for text or text-template mimetype
if tmpl.MIMEType() != ooxml.MainDocumentContentType {
return nil, utils.FormatError(ErrMimetype, fmt.Sprintf("Unsupported mimetype: %s", tmpl.MIMEType()))
}

tmplContentXML, err := tmpl.Open("word/document.xml")
if err != nil {
return nil, fmt.Errorf("loading content.xml from template: %w", err)
}

tmplContent, err := io.ReadAll(tmplContentXML)
if err != nil {
return nil, fmt.Errorf("reading content.xml from template: %w", err)
}

tree, err := xmltree.Parse(tmplContent)
if err != nil {
return nil, fmt.Errorf("parsing content.xml as tree: %w", err)
}

return tree, nil
}

// getODFContent returns the ODF specific content.xml as XMLTree.
func getODFContent(tmpl *odf.Odf) (*xmltree.Node, error) {
// Check for text or text-template mimetype
Expand All @@ -64,7 +86,7 @@ func getODFContent(tmpl *odf.Odf) (*xmltree.Node, error) {
return nil, fmt.Errorf("loading content.xml from template: %w", err)
}

tmplContent, err := ioutil.ReadAll(tmplContentXML)
tmplContent, err := io.ReadAll(tmplContentXML)
if err != nil {
return nil, fmt.Errorf("reading content.xml from template: %w", err)
}
Expand All @@ -76,3 +98,44 @@ func getODFContent(tmpl *odf.Odf) (*xmltree.Node, error) {

return tree, nil
}

// processOdf processes the ODF specific entities for current PackagedDocument.
// The PackagedDocument must be of type *odf.Odf.
func (p *PackagedDocument) processOdf(model *Model, out io.Writer) (*ProcessingData, error) {
tmpl, ok := p.doc.(*odf.Odf)
if !ok {
return nil, fmt.Errorf("%w: processOdf called on non ODF document of type %T", ErrUnknownType, p.doc)
}

templateData := &ProcessingData{
TemplateMimeType: tmpl.MIMEType(),
}

xmlTree, err := getODFContent(tmpl)
if err != nil {
return templateData, err
}

err = runEngine(xmlTree, templateData, model, tmpl.InitScript())
if err != nil {
return templateData, err
}

// Write file, overriding mimetype and content.xml
// TODO: Override/Delete thumbnail and remove it from the manifest.xml
ov := odf.Overrides{
"mimetype": odf.Override{
Data: []byte("application/vnd.oasis.opendocument.text"),
},
"content.xml": odf.Override{
Data: []byte(templateData.XMLResult),
},
}

err = tmpl.Write(out, ov)
if err != nil {
return templateData, fmt.Errorf("writing rendered template: %w", err)
}

return templateData, nil
}
3 changes: 3 additions & 0 deletions internal/document/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/djboris9/xmltree"
"github.com/microfast-ch/rea/internal/engine"
"github.com/microfast-ch/rea/internal/odf"
"github.com/microfast-ch/rea/internal/ooxml"
)

// TODO: Better error description and use it in Go style.
Expand All @@ -30,6 +31,8 @@ func (p *PackagedDocument) Write(model *Model, out io.Writer) (*ProcessingData,
switch p.doc.(type) {
case *odf.Odf:
return p.processOdf(model, out)
case *ooxml.OOXML:
return p.processOoxml(model, out)
default:
return nil, ErrUnknownType
}
Expand Down
9 changes: 5 additions & 4 deletions internal/ooxml/ooxml_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package ooxml

import (
"bytes"
"io/ioutil"
"io"
"os"
"testing"

"github.com/stretchr/testify/require"
Expand All @@ -12,7 +13,7 @@ func TestNew(t *testing.T) {
_, err := New(bytes.NewReader([]byte("")), 10)
require.Error(t, err)

testdata, err := ioutil.ReadFile("../../testdata/Basic1.docx")
testdata, err := os.ReadFile("../../testdata/Basic1.docx")
require.Nil(t, err)

doc, err := New(bytes.NewReader(testdata), int64(len(testdata)))
Expand All @@ -24,7 +25,7 @@ func TestNew(t *testing.T) {
require.Nil(t, err)

// Test invalid file
testdata, err = ioutil.ReadFile("../../testdata/Basic1.ott")
testdata, err = os.ReadFile("../../testdata/Basic1.ott")
require.Nil(t, err)

doc, err = New(bytes.NewReader(testdata), int64(len(testdata)))
Expand Down Expand Up @@ -83,7 +84,7 @@ func TestWrite(t *testing.T) {

updatedDoc, err := doc.Open("word/document.xml")
require.Nil(t, err)
updatedData, err := ioutil.ReadAll(updatedDoc)
updatedData, err := io.ReadAll(updatedDoc)
require.Nil(t, err)
require.Equal(t, []byte("my-extra-file"), updatedData)
}
Empty file added not_odf_rendered.docx
Empty file.

0 comments on commit c42117f

Please sign in to comment.