PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 2.7.4
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v2.7.4
4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / Gutenberg / src / google-docs / edit.js
embedpress / Gutenberg / src / google-docs Last commit date
edit.js 5 years ago editor.scss 5 years ago index.js 5 years ago style.scss 5 years ago
edit.js
162 lines
1 /**
2 * Internal dependencies
3 */
4 import EmbedControls from '../common/embed-controls';
5 import EmbedLoading from '../common/embed-loading';
6 import EmbedPlaceholder from '../common/embed-placeholder';
7 import Iframe from '../common/Iframe';
8
9 /**
10 * WordPress dependencies
11 */
12 const {__} = wp.i18n;
13 const {Component} = wp.element;
14 import {googleDocsIcon} from '../common/icons';
15
16 class GoogleDocsEdit extends Component {
17 constructor() {
18 super(...arguments);
19 this.switchBackToURLInput = this.switchBackToURLInput.bind(this);
20 this.setUrl = this.setUrl.bind(this);
21 this.updateAlignment = this.updateAlignment.bind(this);
22 this.onLoad = this.onLoad.bind(this);
23 this.hideOverlay = this.hideOverlay.bind(this);
24 this.state = {
25 editingURL: false,
26 url: this.props.attributes.url,
27 fetching: true,
28 cannotEmbed: false,
29 interactive: false
30 };
31 }
32
33 static getDerivedStateFromProps(nextProps, state) {
34 if (!nextProps.isSelected && state.interactive) {
35 return {interactive: false};
36 }
37
38 return null;
39 }
40
41 hideOverlay() {
42 this.setState({interactive: true});
43 }
44
45 onLoad() {
46 this.setState({
47 fetching: false
48 })
49 }
50
51 decodeHTMLEntities(str) {
52 if (str && typeof str === 'string') {
53 // strip script/html tags
54 str = str.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '');
55 str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, '');
56
57 }
58 return str;
59 }
60
61 updateAlignment(nextAlign) {
62 const {setAttributes} = this.props;
63 const extraUpdatedAttributes =
64 ['wide', 'full'].indexOf(nextAlign) !== -1
65 ? {width: undefined, height: undefined}
66 : {};
67 setAttributes({
68 ...extraUpdatedAttributes,
69 align: nextAlign,
70 });
71 }
72
73
74 setUrl(event) {
75 if (event) {
76 event.preventDefault();
77 }
78 const {url} = this.state;
79 const {setAttributes} = this.props;
80 setAttributes({url});
81 if (url && url.match(/^http[s]?:\/\/((?:www\.)?docs\.google\.com(?:.*)?(?:document|presentation|spreadsheets|forms|drawings)\/[a-z0-9\/\?=_\-\.\,&%\$#\@\!\+]*)/i)) {
82 var iframeSrc = this.decodeHTMLEntities(url);
83 var regEx = /google\.com(?:.+)?(document|presentation|spreadsheets|forms|drawings)/i;
84 var match = regEx.exec(iframeSrc);
85 var type = match[1];
86 if (type && type === 'document') {
87 if (!iframeSrc.match(/([?&])embedded=true/i)) {
88 if (iframeSrc.indexOf('?') > -1) {
89 iframeSrc += '&embedded=true';
90 } else {
91 iframeSrc += '?embedded=true'
92 }
93 }
94 this.setState({editingURL: false, cannotEmbed: false});
95 setAttributes({iframeSrc: iframeSrc})
96 } else {
97 this.setState({
98 cannotEmbed: true,
99 editingURL: true
100 })
101 }
102 } else {
103 this.setState({
104 cannotEmbed: true,
105 editingURL: true
106 })
107 }
108 }
109
110 switchBackToURLInput() {
111 this.setState({editingURL: true});
112 }
113
114 render() {
115 const {url, editingURL, fetching, cannotEmbed, interactive} = this.state;
116 const {iframeSrc} = this.props.attributes;
117 const label = __('Google Docs URL');
118
119 // No preview, or we can't embed the current URL, or we've clicked the edit button.
120 if (!iframeSrc || editingURL) {
121 return (
122 <div>
123 <EmbedPlaceholder
124 label={label}
125 onSubmit={this.setUrl}
126 value={url}
127 cannotEmbed={cannotEmbed}
128 onChange={(event) => this.setState({url: event.target.value})}
129 icon={googleDocsIcon}
130 DocTitle={__('Learn more about Google doc embed')}
131 docLink={'https://embedpress.com/docs/embed-google-docs-wordpress/'}
132 />
133 </div>
134
135 );
136 } else {
137 return (
138 <div>
139 {fetching ? <EmbedLoading/> : null}
140
141 <Iframe src={iframeSrc} onMouseUp={ this.hideOverlay } onLoad={this.onLoad} style={{display: fetching ? 'none' : ''}}
142 frameBorder="0" width="600" height="450"/>
143
144 { ! interactive && (
145 <div
146 className="block-library-embed__interactive-overlay"
147 onMouseUp={ this.hideOverlay }
148 />
149 ) }
150
151 <EmbedControls
152 showEditButton={iframeSrc && !cannotEmbed}
153 switchBackToURLInput={this.switchBackToURLInput}
154 />
155 </div>
156 )
157 }
158
159 }
160 };
161 export default GoogleDocsEdit;
162