1
+ // @flow
2
+
1
3
import { docsId , elements , styles } from './constants' ;
2
4
import parseHTML from './parseHTML' ;
3
5
4
- const wrapNodeAnchor = ( node , href ) => {
6
+ const wrapNodeAnchor = (
7
+ node : Node ,
8
+ href : string
9
+ ) : HTMLAnchorElement => {
5
10
const anchor = document . createElement ( elements . ANCHOR ) ;
6
11
anchor . href = href ;
7
12
anchor . appendChild ( node . cloneNode ( true ) ) ;
8
13
return anchor ;
9
14
} ;
10
15
11
- const wrapNodeInline = ( node , style ) => {
16
+ const wrapNodeInline = (
17
+ node : Node ,
18
+ style : string
19
+ ) : Node => {
12
20
const el = document . createElement ( style ) ;
13
21
el . appendChild ( node . cloneNode ( true ) ) ;
14
22
return el ;
15
23
} ;
16
24
17
- const wrapNode = ( inner , result ) => {
25
+ const wrapNode = (
26
+ inner : Node ,
27
+ result : Node
28
+ ) : Node => {
18
29
let newNode = result . cloneNode ( true ) ;
19
30
if ( inner . style && inner . style . fontWeight === styles . BOLD ) {
20
31
newNode = wrapNodeInline ( newNode , elements . BOLD ) ;
@@ -37,26 +48,32 @@ const wrapNode = (inner, result) => {
37
48
return newNode ;
38
49
} ;
39
50
40
- const applyBlockStyles = dirty => {
51
+ const applyBlockStyles = (
52
+ dirty : Node
53
+ ) : Node => {
41
54
const node = dirty . cloneNode ( true ) ;
42
55
let newNode = document . createTextNode ( node . textContent ) ;
43
- let styledNode = null ;
56
+ let styledNode = document . createTextNode ( '' ) ;
44
57
if ( node . childNodes [ 0 ] && node . childNodes [ 0 ] . style ) {
45
58
styledNode = node . childNodes [ 0 ] ;
46
59
}
47
60
if ( node . childNodes [ 0 ] && node . childNodes [ 0 ] . nodeName === 'A' ) {
61
+ // flow-ignore Flow doesn't recognize that a childNode can be an HTMLAnchorElement
48
62
newNode = wrapNodeAnchor ( newNode . cloneNode ( true ) , node . childNodes [ 0 ] . href ) ;
49
63
styledNode = node . childNodes [ 0 ] . childNodes [ 0 ] ;
50
64
}
51
65
newNode = wrapNode ( styledNode , newNode ) ;
52
66
return newNode ;
53
67
} ;
54
68
55
- const applyInlineStyles = dirty => {
69
+ const applyInlineStyles = (
70
+ dirty : Node
71
+ ) : Node => {
56
72
const node = dirty . cloneNode ( true ) ;
57
73
let newNode = document . createTextNode ( node . textContent ) ;
58
74
let styledNode = node ;
59
75
if ( node . nodeName === 'A' ) {
76
+ // flow-ignore Flow doesn't recognize that cloneNode() can return an HTMLAnchorElement
60
77
newNode = wrapNodeAnchor ( newNode , node . href ) ;
61
78
if ( node . childNodes [ 0 ] && node . childNodes [ 0 ] . style ) {
62
79
styledNode = node . childNodes [ 0 ] ;
@@ -66,7 +83,9 @@ const applyInlineStyles = dirty => {
66
83
return newNode ;
67
84
} ;
68
85
69
- const getCleanNode = ( node ) => {
86
+ const getCleanNode = (
87
+ node : Node
88
+ ) : Array < Node > => {
70
89
if ( node . childNodes && node . childNodes . length <= 1 ) {
71
90
let newWrapper = null ;
72
91
let newNode = document . createTextNode ( node . textContent ) ;
@@ -94,7 +113,7 @@ const getCleanNode = (node) => {
94
113
}
95
114
return nodes ;
96
115
}
97
- return node ;
116
+ return [ node ] ;
98
117
} ;
99
118
100
119
/**
@@ -103,7 +122,9 @@ const getCleanNode = (node) => {
103
122
* @param dirty
104
123
* @returns {HTMLElement }
105
124
*/
106
- const getCleanDocument = ( dirty ) => {
125
+ const getCleanDocument = (
126
+ dirty : HTMLElement
127
+ ) : HTMLElement => {
107
128
// create a new document to preserve the integrity of the original data
108
129
const body = document . createElement ( 'body' ) ;
109
130
const nodes = dirty . childNodes ;
@@ -123,7 +144,9 @@ const getCleanDocument = (dirty) => {
123
144
return body ;
124
145
} ;
125
146
126
- module . exports = ( clipboardContent ) => {
147
+ module . exports = (
148
+ clipboardContent : string
149
+ ) : string => {
127
150
if ( typeof clipboardContent !== 'string' ) {
128
151
throw new Error ( `Expected 'clipboardContent' to be a string of HTML, received ${ typeof clipboardContent } ` ) ;
129
152
}
0 commit comments