@@ -3,68 +3,80 @@ import destr from 'destr'
3
3
import { xml2json } from 'xml-js'
4
4
import { EntityType , ImporterData , ImporterEntity } from 'better-write-types'
5
5
6
- const extractFilter = async ( entries : zip . Entry [ ] , position : number = 3 ) => {
6
+ const extractFilter = async (
7
+ entries : zip . Entry [ ]
8
+ ) : Promise < any [ ] | undefined > => {
9
+ const arr : any = [ ]
10
+
7
11
if ( entries . length ) {
8
- const target = entries [ position ]
9
-
10
- // @ts -ignore
11
- const text = await target . getData ( new zip . TextWriter ( ) )
12
-
13
- const result = await xml2json ( text , {
14
- compact : true ,
15
- elementNameFn : ( val ) => {
16
- return val . replace ( 'w:' , '' ) . replace ( '_' , '' ) . replace ( 'xml:' , '' )
17
- } ,
18
- ignoreComment : true ,
19
- ignoreDeclaration : true ,
20
- spaces : 2 ,
21
- } )
12
+ for ( const target of entries ) {
13
+ if ( target . filename === 'word/document.xml' ) {
14
+ // @ts -ignore
15
+ const text = await target . getData ( new zip . TextWriter ( ) )
16
+
17
+ const result = await xml2json ( text , {
18
+ compact : true ,
19
+ elementNameFn : ( val ) => {
20
+ return val . replace ( 'w:' , '' ) . replace ( '_' , '' ) . replace ( 'xml:' , '' )
21
+ } ,
22
+ ignoreComment : true ,
23
+ ignoreDeclaration : true ,
24
+ spaces : 2 ,
25
+ } )
26
+
27
+ arr . push ( destr ( result ) )
28
+ }
29
+ }
22
30
23
- return destr ( result )
31
+ return arr
24
32
}
33
+
34
+ return undefined
25
35
}
26
36
27
- const DocxToBW = async ( data : Record < string , any > ) : Promise < ImporterData > => {
37
+ const DocxToBW = async ( arr : Record < string , any > [ ] ) : Promise < ImporterData > => {
28
38
const result : ImporterEntity [ ] = [ ]
29
39
30
- data . body . p . forEach ( ( target : any ) => {
31
- const style = target ?. pPr ?. pStyle ?. _attributes [ 'w:val' ]
32
- const raw = target ?. r ?. t ?. _text
33
-
34
- if ( style && raw ) {
35
- let type : EntityType | null = null
36
-
37
- switch ( style ) {
38
- case 'Heading1' :
39
- type = 'heading-one'
40
- break
41
- case 'Heading2' :
42
- type = 'heading-two'
43
- break
44
- case 'Heading3' :
45
- case 'Heading4' :
46
- case 'Heading5' :
47
- case 'Heading6' :
48
- type = 'heading-three'
49
- break
40
+ arr . forEach ( ( data ) => {
41
+ data ?. document ?. body ?. p ?. forEach ( ( target : any ) => {
42
+ const style = target ?. pPr ?. pStyle ?. _attributes [ 'w:val' ]
43
+ const raw = target ?. r ?. t ?. _text
44
+
45
+ if ( style && raw ) {
46
+ let type : EntityType | null = null
47
+
48
+ switch ( style ) {
49
+ case 'Heading1' :
50
+ case 'Heading2' :
51
+ type = 'heading-one'
52
+ break
53
+ case 'Heading3' :
54
+ case 'Heading4' :
55
+ type = 'heading-two'
56
+ break
57
+ case 'Heading5' :
58
+ case 'Heading6' :
59
+ type = 'heading-three'
60
+ break
61
+ }
62
+
63
+ if ( type ) {
64
+ result . push ( {
65
+ type,
66
+ raw,
67
+ } )
68
+ }
69
+
70
+ return
50
71
}
51
72
52
- if ( type ) {
73
+ if ( raw ) {
53
74
result . push ( {
54
- type,
75
+ type : 'paragraph' ,
55
76
raw,
56
77
} )
57
78
}
58
-
59
- return
60
- }
61
-
62
- if ( raw ) {
63
- result . push ( {
64
- type : 'paragraph' ,
65
- raw,
66
- } )
67
- }
79
+ } )
68
80
} )
69
81
70
82
return {
@@ -77,11 +89,17 @@ export const DocxToJson = async (data: string): Promise<ImporterData> => {
77
89
78
90
const entries = await reader . getEntries ( )
79
91
80
- const { document } = await extractFilter ( entries )
92
+ const arr = await extractFilter ( entries )
81
93
82
94
await reader . close ( )
83
95
84
- const final = DocxToBW ( document )
96
+ if ( ! arr ) {
97
+ return {
98
+ entities : [ ] ,
99
+ }
100
+ }
101
+
102
+ const final = DocxToBW ( arr )
85
103
86
104
return final
87
105
}
0 commit comments