Files
medicalalert-web-reloaded/wp/wp-content/plugins/wp-media-folder/class/class-pdf-embed.php
2024-07-23 13:26:20 -04:00

495 lines
20 KiB
PHP

<?php
/* Prohibit direct script loading */
defined('ABSPATH') || die('No direct script access allowed!');
/**
* Class WpmfPdfEmbed
* This class that holds most of the PDF embed functionality for Media Folder.
*/
class WpmfPdfEmbed
{
/**
* Wpmf_Pdf_Embed constructor.
*/
public function __construct()
{
add_action('wp_enqueue_media', array($this, 'loadScript'));
add_action('wp_enqueue_scripts', array($this, 'registerScript'));
add_action('wp_enqueue_scripts', array($this, 'loadStyleScript'));
add_filter('media_send_to_editor', array($this, 'addImageFiles'), 10, 3);
add_filter('attachment_fields_to_edit', array($this, 'attachmentFieldsToEdit'), 10, 2);
add_filter('attachment_fields_to_save', array($this, 'attachmentFieldsToSave'), 10, 2);
add_action('enqueue_block_editor_assets', array($this, 'addEditorAssets'));
add_shortcode('wpmfpdf', array($this, 'wpmfPdf'));
add_filter('the_content', array($this, 'theContent'));
if (defined('ELEMENTOR_VERSION') && version_compare(ELEMENTOR_VERSION, '3.5', '<')) {
add_action('elementor/widgets/widgets_registered', array($this, 'loadElementorWidget'));
} else {
add_action('elementor/widgets/register', array($this, 'loadElementorWidget'));
}
add_action('wp_ajax_wpmf_load_pdf_embed', array($this, 'loadPdfEmbedHtmlGutenberg'));
add_action('wp_ajax_wpmf_divi_load_pdf_embed_html', array($this, 'loadPdfEmbedHtml'));
}
/**
* Load file design html
*
* @return void
*/
public function loadPdfEmbedHtmlGutenberg()
{
if (empty($_REQUEST['wpmf_nonce'])
|| !wp_verify_nonce($_REQUEST['wpmf_nonce'], 'wpmf_nonce')) {
wp_send_json(array('status' => false, 'html' => '<p>'. esc_html__('Have error when load html from URL', 'wpmf') .'</p>'));
}
$width = (!empty($_REQUEST['width'])) ? (int)$_REQUEST['width'] : '';
$height = (!empty($_REQUEST['height'])) ? (int)$_REQUEST['height'] : '';
$html = do_shortcode('[wpmfpdf id="'. (int)$_REQUEST['id'] .'" width="'. $width .'" height="'. $height .'" embed="'. $_REQUEST['embed'] .'" target="'. $_REQUEST['target'] .'"]');
wp_send_json(array('status' => true, 'html' => $html));
}
/**
* Load file design html
*
* @return void
*/
public function loadPdfEmbedHtml()
{
if (empty($_REQUEST['et_admin_load_nonce'])
|| !wp_verify_nonce($_REQUEST['et_admin_load_nonce'], 'et_admin_load_nonce')) {
wp_send_json(array('status' => false, 'html' => '<p>'. esc_html__('Have error when load html from URL', 'wpmf') .'</p>'));
}
if (empty($_REQUEST['url'])) {
wp_send_json(array('status' => false, 'html' => '<p>'. esc_html__('Have error when load html from URL', 'wpmf') .'</p>'));
}
$url = str_replace(array('-pdf.jpg', '-pdf.jpeg', '-pdf.png'), '.pdf', $_REQUEST['url']);
if (strpos($url, 'admin-ajax.php?action=wpmf') !== false) {
if (!empty($_REQUEST['id'])) {
$url .= '&id=' . $_REQUEST['id'] . '&dl=0';
}
}
$width = (!empty($_REQUEST['width']) && $_REQUEST['width'] !== 'auto') ? $_REQUEST['width'] : '100%';
$height = (!empty($_REQUEST['height']) && $_REQUEST['height'] !== 'auto') ? $_REQUEST['height'] : '800';
$html = do_shortcode('[wpmfpdf is_divi="1" url="'. $url .'" width="'. $width .'" height="'. $height .'" embed="'. $_REQUEST['embed'] .'" target="'. $_REQUEST['target'] .'"]');
wp_send_json(array('status' => true, 'html' => $html));
}
/**
* Load elementor widget
*
* @return void
*/
public function loadElementorWidget()
{
require_once(WP_MEDIA_FOLDER_PLUGIN_DIR . 'class/elementor-widgets/class-pdf-embed-elementor-widget.php');
if (defined('ELEMENTOR_VERSION') && version_compare(ELEMENTOR_VERSION, '3.5', '<')) {
\Elementor\Plugin::instance()->widgets_manager->register_widget_type(new \WpmfPdfEmbedElementorWidget());
} else {
\Elementor\Plugin::instance()->widgets_manager->register(new \WpmfPdfEmbedElementorWidget());
}
}
/**
* Enqueue styles and scripts for gutenberg
*
* @return void
*/
public function addEditorAssets()
{
wp_enqueue_script(
'wpmf_pdf_blocks',
WPMF_PLUGIN_URL . 'assets/js/blocks/pdfembed/block.js',
array('wp-blocks', 'wp-i18n', 'wp-element', 'wp-data', 'wp-block-editor'),
WPMF_VERSION
);
$this->registerScript();
$this->enqueue();
$params = array(
'l18n' => array(
'block_pdf_title' => __('WP Media Folder PDF Embed', 'wpmf'),
),
'vars' => array(
'wpmf_nonce' => wp_create_nonce('wpmf_nonce'),
'ajaxurl' => admin_url('admin-ajax.php')
)
);
wp_localize_script('wpmf_pdf_blocks', 'wpmf_pdf_blocks', $params);
}
/**
* Load PDF script
*
* @param string $content Content
*
* @return string
*/
public function theContent($content)
{
if (strpos($content, 'wpmf-pdfemb-viewer') || strpos($content, 'data-wpmf_pdf_embed="embed"') || strpos($content, 'wpmfpdf')) {
$this->enqueue();
}
return $content;
}
/**
* Render PDF embed
*
* @param array $attrs Shortcode params
*
* @return string
*/
public function wpmfPdf($attrs)
{
if (!empty($attrs['url'])) {
$url = $attrs['url'];
$title = basename($attrs['url']);
} else {
if (empty($attrs['id'])) {
return '';
}
$url = wp_get_attachment_url($attrs['id']);
$pdf = get_post($attrs['id']);
if (empty($pdf)) {
return '';
}
$cloud_type = get_post_meta((int)$attrs['id'], 'wpmf_drive_type', true);
$drive_id = get_post_meta((int)$attrs['id'], 'wpmf_drive_id', true);
$baseUrl = admin_url('admin-ajax.php');
switch ($cloud_type) {
case 'dropbox':
$action = '?action=wpmf-dbxdownload-file&id=' . urlencode($drive_id) . '&link=true&dl=0';
break;
case 'onedrive':
$action = '?action=wpmf_onedrive_download&id=' . urlencode($drive_id) . '&link=true&dl=0';
break;
case 'onedrive_business':
$action = '?action=wpmf_onedrive_business_download&id=' . urlencode($drive_id) . '&link=true&dl=0';
break;
case 'google_drive':
$action = '?action=wpmf-download-file&id=' . urlencode($drive_id) . '&link=true&dl=0';
break;
case 'nextcloud':
$action = '?action=wpmf_nextcloud_get_content&url=' . urlencode($url) . '/download';
break;
default:
$action = '';
$offload_infos = get_post_meta($attrs['id'], 'wpmf_awsS3_info', true);
if (!empty($offload_infos)) {
$action = '?action=wpmf_offload_get_content&url=' . urlencode($url);
}
break;
}
if ($action) {
$url = $baseUrl . $action;
}
$title = $pdf->post_title;
}
if (!empty($attrs['embed']) && $attrs['embed'] !== 'off') {
if (empty($attrs['is_divi'])) {
$this->enqueue();
}
$width = (!empty($attrs['width']) && strpos($attrs['width'], '%') === false) ? $attrs['width'] : '100%';
$height = (!empty($attrs['height']) && strpos($attrs['height'], '%') === false) ? $attrs['height'] : '800';
$download = (!empty($attrs['download'])) ? $attrs['download'] : 'off';
$plugin_dir_url = plugin_dir_url(__DIR__);
$viewer_base_url = $plugin_dir_url . 'class/templates/pdf-embed.php';
$response = wp_remote_head($url);
if (is_wp_error($response)) {
$url = $plugin_dir_url . 'assets/pdf-loading-error.pdf';
}
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code === 404) {
$url = $plugin_dir_url . 'assets/pdf-loading-error.pdf';
}
$attachment_info = '?file=' . urlencode($url);
$final_url = $viewer_base_url . $attachment_info . '&plugins_url=' . urlencode($plugin_dir_url);
$return = '<div><iframe width="' . esc_attr($width) . '" height="' . esc_attr($height) . '" src="' . esc_url($final_url) . '" title="Embedded PDF" class="wpmf-pdfjs-iframe"></iframe></div>';
} else {
$return = '<a href="'.esc_url($url).'" '. (($attrs['target'] !== '') ? 'target="'.esc_attr($attrs['target']).'"' : '') .'>'.esc_html($title).'</a>';
}
return $return;
}
/**
* Load styles and scripts
*
* @return void
*/
public function loadStyleScript()
{
global $post;
if (!empty($post)) {
$is_elementor = get_post_meta($post->ID, '_elementor_edit_mode', true);
if ($is_elementor === 'builder') {
$_elementor_data = get_post_meta($post->ID, '_elementor_data', true);
if (!is_string($_elementor_data)) {
$_elementor_data = json_encode($_elementor_data);
}
if (strpos($_elementor_data, 'wpmf-pdfemb-viewer') || strpos($_elementor_data, 'data-wpmf_pdf_embed="embed"') || strpos($_elementor_data, 'wpmfpdf')) {
$this->enqueue();
}
} else {
if (strpos($post->post_content, 'wpmf-pdfemb-viewer') || strpos($post->post_content, 'data-wpmf_pdf_embed="embed"') || strpos($post->post_content, 'wpmfpdf')) {
$this->enqueue();
}
}
}
}
/**
* Load script and style
*
* @return void
*/
public function enqueue()
{
wp_enqueue_script('wpmf_compat_js');
}
/**
* Localize a script.
* Works only if the script has already been added.
*
* @return array
*/
public function getTranslation()
{
$array = array(
// 'worker_src' => plugins_url('assets/js/pdf-embed/pdf.worker.min.js', dirname(__FILE__)),
'worker_src' => plugins_url('assets/js/pdf-embed/pdf.worker.js', dirname(__FILE__)),
'cmap_url' => plugins_url('assets/js/pdf-embed/cmaps/', dirname(__FILE__)),
'pdf_sandbox'=> plugins_url('assets/js/pdf-embed/pdf.sandbox.js', dirname(__FILE__)),
'objectL10n' =>
array(
'loading' => __('Loading...', 'wpmf'),
'page' => __('Page', 'wpmf'),
'zoom' => __('Zoom', 'wpmf'),
'prev' => __('Previous page', 'wpmf'),
'next' => __('Next page', 'wpmf'),
'zoomin' => __('Zoom In', 'wpmf'),
'zoomout' => __('Zoom Out', 'wpmf'),
'secure' => __('Secure', 'wpmf'),
'download' => __('Download PDF', 'wpmf'),
'fullscreen' => __('Full Screen', 'wpmf'),
'domainerror' => __('Error: URL to the PDF file must be on exactly the same domain as the current web page.', 'wpmf'),
'clickhereinfo' => __('Click here for more info', 'wpmf'),
'widthheightinvalid' => __('PDF page width or height are invalid', 'wpmf'),
'viewinfullscreen' => __('View in Full Screen', 'wpmf'),
'poweredby' => 1
)
);
return $array;
}
/**
* Add pdf embed html to editor
*
* @param string $html HTML markup for a media item sent to the editor.
* @param integer $id The first key from the $_POST['send'] data.
* @param array $attachment Array of attachment metadata.
*
* @return string $html
*/
public function addImageFiles($html, $id, $attachment)
{
$post = get_post($id);
$mimetype = explode('/', $post->post_mime_type);
$pdf_embed = get_post_meta($id, 'wpmf_pdf_embed', true);
$target = get_post_meta($id, '_gallery_link_target', true);
if ($mimetype[1] === 'pdf') {
if (isset($pdf_embed) && $pdf_embed === 'embed') {
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$sousce = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
$doc->loadHTML($sousce);
$tags = $doc->getElementsByTagName('a');
if ($tags->length > 0) {
if (!empty($tags)) {
$cloud_type = get_post_meta((int)$id, 'wpmf_drive_type', true);
if ($cloud_type === 'dropbox') {
$drive_id = get_post_meta((int)$id, 'wpmf_drive_id', true);
$url = admin_url('admin-ajax.php') . '?action=wpmf-dbxdownload-file&id=' . urlencode($drive_id) . '&link=true&dl=0';
$tags->item(0)->setAttribute('href', $url);
}
$class = $tags->item(0)->getAttribute('class');
if (!empty($class)) {
$newclass = $class . ' wpmf-pdfemb-viewer';
} else {
$newclass = 'wpmf-pdfemb-viewer';
}
$tags->item(0)->setAttribute('target', $target);
$tags->item(0)->setAttribute('class', $newclass);
$html = $doc->saveHTML();
}
}
} else {
$singlefile = get_option('wpmf_option_singlefile');
if (isset($singlefile) && (int) $singlefile === 1) {
$meta = get_post_meta($id, '_wp_attached_file');
$upload_dir = wp_upload_dir();
$url_attachment = $upload_dir['basedir'] . '/' . $meta[0];
if (file_exists($url_attachment)) {
$size = filesize($url_attachment);
if ($size < 1024 * 1024) {
$size = round($size / 1024, 1) . ' kB';
} elseif ($size > 1024 * 1024) {
$size = round($size / (1024 * 1024), 1) . ' MB';
}
} else {
$size = 0;
}
$type = wp_check_filetype($post->guid);
$ext = $type['ext'];
$html = '<span class="wpmf_mce-wrap" data-file="' . $id . '" style="overflow: hidden;">';
$html .= '<a class="wpmf-defile wpmf_mce-single-child"
href="' . $post->guid . '" data-id="' . $id . '" target="' . $target . '">';
$html .= '<span class="wpmf_mce-single-child" style="font-weight: bold;">';
$html .= $post->post_title;
$html .= '</span><br>';
$html .= '<span class="wpmf_mce-single-child" style="font-weight: normal;font-size: 0.8em;">';
$html .= '<b class="wpmf_mce-single-child">' . esc_html__('Size', 'wpmf') . ' : </b>' . $size;
$html .= '<b class="wpmf_mce-single-child"> ' . esc_html__('Format', 'wpmf') . ' : </b>' . strtoupper($ext) . '</span>';
$html .= '</a>';
$html .= '</span>';
} else {
$html = preg_replace('/(<a\b[^><]*)>/i', '$1 target="' . $target . '">', $html);
}
}
}
return $html;
}
/**
* Add footer
*
* @return void
*/
public function adminFooterPdfEmbed()
{
?>
<script type="text/javascript">
if (typeof jQuery !== "undefined") {
jQuery(function () {
if (typeof wp !== "undefined" && typeof wp.media !== "undefined" && typeof wp.media.events !== "undefined") {
wp.media.events.on('editor:image-edit', function (data) {
data.metadata.wpmf_pdf_embed = data.editor.dom.getAttrib(data.image, 'data-wpmf_pdf_embed');
});
}
});
}
</script>
<?php
}
/**
* Add script
*
* @return void
*/
public function registerScript()
{
wp_register_script(
'wpmf_compat_js',
plugins_url('assets/js/pdf-embed/compatibility.js', dirname(__FILE__)),
array('jquery')
);
}
/**
* Add script
*
* @return void
*/
public function addCustomPdfL10nLink()
{
$locale_url = plugins_url('assets/js/pdf-embed/locale/locale.properties', dirname(__FILE__));
echo '<link rel="resource" type="application/l10n" href="' . esc_url($locale_url) . '">';
}
/**
* Add footer script
*
* @return void
*/
public function loadScript()
{
add_action('admin_footer', array($this, 'adminFooterPdfEmbed'), 11);
add_action('wp_footer', array($this, 'adminFooterPdfEmbed'), 11);
}
/**
* Create enable PDF embed field
* Based on /wp-admin/includes/media.php
*
* @param array $form_fields An array of attachment form fields.
* @param WP_Post $post The WP_Post attachment object.
*
* @return mixed
*/
public function attachmentFieldsToEdit($form_fields, $post)
{
if ($post->post_mime_type === 'application/pdf') {
$value = get_post_meta($post->ID, 'wpmf_pdf_embed', true);
if (empty($value)) {
$value = 'large';
}
$embed = array(
'link' => __('Off', 'wpmf'),
'embed' => __('On', 'wpmf'),
);
$option = '';
foreach ($embed as $k => $v) {
if ($value === $k) {
$option .= '<option selected value="' . $k . '">' . $v . '</option>';
} else {
$option .= '<option value="' . $k . '">' . $v . '</option>';
}
}
$form_fields['wpmf_pdf_embed'] = array(
'label' => __('PDF Embed', 'wpmf'),
'input' => 'html',
'html' => '
<select name="attachments[' . $post->ID . '][wpmf_pdf_embed]"
id="attachments[' . $post->ID . '][wpmf_pdf_embed]">
' . $option . '
</select>'
);
}
return $form_fields;
}
/**
* Save enable PDF embed option
* Based on /wp-admin/includes/media.php
*
* @param array $post An array of post data.
* @param array $attachment An array of attachment metadata.
*
* @return mixed $post
*/
public function attachmentFieldsToSave($post, $attachment)
{
if (isset($attachment['wpmf_pdf_embed'])) {
update_post_meta($post['ID'], 'wpmf_pdf_embed', $attachment['wpmf_pdf_embed']);
}
return $post;
}
}