PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 2.6.1
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v2.6.1
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 6 years ago index.js 6 years ago style.scss 6 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.state = {
24 editingURL: false,
25 url: this.props.attributes.url,
26 fetching: true,
27 cannotEmbed: false,
28 interactive: false
29 };
30 }
31
32 static getDerivedStateFromProps(nextProps, state) {
33 if (!nextProps.isSelected && state.interactive) {
34 return {interactive: false};
35 }
36
37 return null;
38 }
39
40 hideOverlay() {
41 this.setState({interactive: true});
42 }
43
44 onLoad() {
45 this.setState({
46 fetching: false
47 })
48 }
49
50 decodeHTMLEntities(str) {
51 if (str && typeof str === 'string') {
52 // strip script/html tags
53 str = str.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '');
54 str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, '');
55
56 }
57 return str;
58 }
59
60 updateAlignment(nextAlign) {
61 const {setAttributes} = this.props;
62 const extraUpdatedAttributes =
63 ['wide', 'full'].indexOf(nextAlign) !== -1
64 ? {width: undefined, height: undefined}
65 : {};
66 setAttributes({
67 ...extraUpdatedAttributes,
68 align: nextAlign,
69 });
70 }
71
72
73 setUrl(event) {
74 if (event) {
75 event.preventDefault();
76 }
77 const {url} = this.state;
78 const {setAttributes} = this.props;
79 setAttributes({url});
80 if (url && url.match(/^http[s]?:\/\/((?:www\.)?docs\.google\.com(?:.*)?(?:document|presentation|spreadsheets|forms|drawings)\/[a-z0-9\/\?=_\-\.\,&%\$#\@\!\+]*)/i)) {
81 var iframeSrc = this.decodeHTMLEntities(url);
82 var regEx = /google\.com(?:.+)?(document|presentation|spreadsheets|forms|drawings)/i;
83 var match = regEx.exec(iframeSrc);
84 var type = match[1];
85 if (type && type == 'document') {
86 if (!iframeSrc.match(/([?&])embedded=true/i)) {
87 if (iframeSrc.indexOf('?') > -1) {
88 iframeSrc += '&embedded=true';
89 } else {
90 iframeSrc += '?embedded=true'
91 }
92 }
93 this.setState({editingURL: false, cannotEmbed: false});
94 setAttributes({iframeSrc: iframeSrc})
95 } else {
96 this.setState({
97 cannotEmbed: true,
98 editingURL: true
99 })
100 }
101 } else {
102 this.setState({
103 cannotEmbed: true,
104 editingURL: true
105 })
106 }
107 }
108
109 switchBackToURLInput() {
110 this.setState({editingURL: true});
111 }
112
113 render() {
114 const {url, editingURL, fetching, cannotEmbed, interactive} = this.state;
115 const {iframeSrc} = this.props.attributes;
116 const label = __('Google Docs URL');
117
118 // No preview, or we can't embed the current URL, or we've clicked the edit button.
119 if (!iframeSrc || editingURL) {
120 return (
121 <div>
122 <EmbedPlaceholder
123 label={label}
124 onSubmit={this.setUrl}
125 value={url}
126 cannotEmbed={cannotEmbed}
127 onChange={(event) => this.setState({url: event.target.value})}
128 icon={googleDocsIcon}
129 DocTitle={__('Learn more about Google doc embed')}
130 docLink={'https://embedpress.com/docs/embed-google-docs-wordpress/'}
131 />
132 </div>
133
134 );
135 } else {
136 return (
137 <div>
138 {fetching ? <EmbedLoading/> : null}
139
140 <Iframe src={iframeSrc} onMouseUp={ this.hideOverlay } onLoad={this.onLoad} style={{display: fetching ? 'none' : ''}}
141 frameborder="0" width="600" height="450" allowfullscreen="true"
142 mozallowfullscreen="true" webkitallowfullscreen="true"/>
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