1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
new WPCOM_JSON_API_Render_Embed_Reversal_Endpoint(
array(
'description' => 'Determines if the given embed code can be reversed into a single line embed or a shortcode, and if so returns the embed or shortcode. Note: The current user must have publishing access.',
'group' => '__do_not_document',
'stat' => 'embeds:reversal',
'method' => 'POST',
'path' => '/sites/%s/embeds/reversal',
'path_labels' => array(
'$site' => '(int|string) Site ID or domain',
),
'request_format' => array(
'maybe_embed' => '(string) The embed code to reverse. Required. Only accepts one at a time.',
),
'response_format' => array(
'maybe_embed' => '(string) The original embed code that was passed in for rendering.',
'reversal_type' => '(string) The type of reversal. Either an embed or a shortcode.',
'render_result' => '(html) The rendered HTML result of the embed or shortcode.',
'result' => '(string) The reversed content. Either a single line embed or a shortcode.',
'scripts' => '(array) An array of JavaScript files needed to render the embed or shortcode. Returned in the format of <code>{ "script-slug" : { "src": "http://example.com/file.js", "extra" : "" } }</code> where extra contains any neccessary extra JS for initializing the source file and src contains the script to load. Omitted if no scripts are neccessary.',
'styles' => '(array) An array of CSS files needed to render the embed or shortcode. Returned in the format of <code>{ "style-slug" : { "src": "http://example.com/file.css", "media" : "all" } }</code>. Omitted if no styles are neccessary.',
),
'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/shortcode-reversals/render/',
'example_request_data' => array(
'headers' => array(
'authorization' => 'Bearer YOUR_API_TOKEN',
),
'body' => array(
'maybe_embed' => '<iframe width="480" height="302" src="http://www.ustream.tv/embed/recorded/26370522/highlight/299667?v=3&wmode=direct" scrolling="no" frameborder="0"></iframe>',
),
),
)
);
/**
* Render embed reversal class.
*
* /sites/%s/embeds/reversal -> $blog_id
*/
class WPCOM_JSON_API_Render_Embed_Reversal_Endpoint extends WPCOM_JSON_API_Render_Endpoint {
/**
* API callback.
*
* @param string $path - the path (unused).
* @param int $blog_id - the blog ID.
*
* @return array|WP_Error
*/
public function callback( $path = '', $blog_id = 0 ) {
$blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
if ( is_wp_error( $blog_id ) ) {
return $blog_id;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new WP_Error( 'unauthorized', 'Your token must have permission to post on this blog.', 403 );
}
$is_embed = false;
$is_shortcode = false;
$input = $this->input( true );
$maybe_embed = trim( $input['maybe_embed'] );
if ( empty( $maybe_embed ) ) {
return new WP_Error( 'empty_embed', 'Please provide an embed code to process.', 400 );
}
$ksesed_content = trim( wp_strip_all_tags( wp_kses_post( $maybe_embed ), true ) );
if ( empty( $ksesed_content ) ) {
return new WP_Error( 'invalid_embed', 'Invalid or empty embed provided.', 400 );
}
$shortcode_pattern = get_shortcode_regex();
$url_pattern = '/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i';
preg_match_all( "/$shortcode_pattern/s", $ksesed_content, $shortcode_matches );
preg_match_all( "$url_pattern", $ksesed_content, $url_matches );
if ( empty( $shortcode_matches[0] ) && empty( $url_matches[0] ) ) {
return new WP_Error( 'invalid_embed', 'The provided embed is not supported.', 400 );
}
if ( ( count( $shortcode_matches[0] ) + count( $url_matches[0] ) ) > 1 ) {
return new WP_Error( 'invalid_embed', 'Only one embed/shortcode reversal can be rendered at a time.', 400 );
}
if ( ! empty( $shortcode_matches[0] ) ) {
$is_shortcode = true;
} elseif ( ! empty( $url_matches[0] ) ) {
$is_embed = true;
}
$render = $this->process_render(
array( $this, 'render_shortcode_reversal' ),
array(
'shortcode_reversal' => $ksesed_content,
'is_shortcode' => $is_shortcode,
'is_embed' => $is_embed,
)
);
// if nothing happened, then the shortcode does not exist.
global $wp_embed;
if ( empty( $render ) || empty( $render['result'] ) || $ksesed_content === $render['result'] || $wp_embed->maybe_make_link( $maybe_embed ) === $render['result'] ) {
return new WP_Error( 'invalid_embed', 'The provided embed is not supported.', 400 );
}
// our output for this endpoint..
$return = array();
$return['maybe_embed'] = $maybe_embed;
$return['result'] = $ksesed_content;
$return['reversal_type'] = ( $is_embed ) ? 'embed' : 'shortcode';
$return['render_result'] = $render['result'];
$return = $this->add_assets( $return, $render['loaded_scripts'], $render['loaded_styles'] );
return $return;
}
/**
* Render the shortcode reversal.
*
* @param array $args - the arguments.
*
* @return mixed|false
*/
public function render_shortcode_reversal( $args ) {
if ( $args['is_shortcode'] ) {
return $this->do_shortcode( $args['shortcode_reversal'] );
} elseif ( $args['is_embed'] ) {
return $this->do_embed( $args['shortcode_reversal'] );
}
return false;
}
}
|