diff --git a/ajax/loadfile.php b/ajax/loadfile.php new file mode 100644 index 00000000..1919d641 --- /dev/null +++ b/ajax/loadfile.php @@ -0,0 +1,44 @@ +getSession()->close(); + +// Set the session key for the file we are about to edit. +$dir = isset($_GET['dir']) ? $_GET['dir'] : ''; +$filename = isset($_GET['file']) ? $_GET['file'] : ''; +$token = isset($_GET['token']) ? $_GET['token'] : ''; +if(!empty($filename)) +{ + header('Content-Type: application/pdf'); + + if(!empty($token)) + { + $linkItem = \OC::$server->getShareManager()->getShareByToken($token); + $owner = $linkItem->getShareOwner(); + \OC\Files\Filesystem::init($owner, '/' . $owner . '/files'); + $dir = '/' . \OC\Files\Filesystem::getPath($linkItem->getNodeId()); + $dir = rtrim($dir, '/'); + } + + $path = $dir.'/'.$filename; + $filecontents = \OC\Files\Filesystem::file_get_contents($path); + + if($filecontents) + { + echo $filecontents; + } + else + { + \OCP\Util::writeLog('files_pdfviewer', 'Error when opening PDF ' . $path, \OCP\Util::ERROR); + OCP\JSON::error(['data' => ['message' => 'A problem occoured while loading the PDF']]); + } + return; + +} +else +{ + OCP\JSON::error(['data' => ['message' => 'Invalid file path supplied.']]); +} diff --git a/ajax/loadpublicfile.php b/ajax/loadpublicfile.php new file mode 100644 index 00000000..8328bc5a --- /dev/null +++ b/ajax/loadpublicfile.php @@ -0,0 +1,38 @@ +getSession()->close(); + +// Set the session key for the file we are about to edit. +$token = isset($_GET['token']) ? $_GET['token'] : ''; +if(!empty($token)) +{ + header('Content-Type: application/pdf'); + + $linkItem = \OC::$server->getShareManager()->getShareByToken($token); + $owner = $linkItem->getShareOwner(); + + \OC\Files\Filesystem::tearDown(); + \OC\Files\Filesystem::init($owner, '/' . $owner . '/files'); + + $path = '/' . \OC\Files\Filesystem::getPath($linkItem->getNodeId()); + + $filecontents = \OC\Files\Filesystem::file_get_contents($path); + + if($filecontents) + { + echo $filecontents; + } + else + { + \OCP\Util::writeLog('files_nbviewer', 'Error while opening PDF ' . $path, \OCP\Util::ERROR); + OCP\JSON::error(['data' => ['message' => 'A problem occoured while loading the PDF']]); + } + return; + +} else { + OCP\JSON::error(['data' => ['message' => 'Invalid file path supplied.']]); +} \ No newline at end of file diff --git a/appinfo/app.php b/appinfo/app.php new file mode 100644 index 00000000..6b8e999b --- /dev/null +++ b/appinfo/app.php @@ -0,0 +1,4 @@ + + + files_nbviewer + CERNBox NB Viewer + This application integrates the IPython/Jupyter Notebook framework into CERNBox files application + AGPL + Nadir Roman Guerrero + 8.2.0 + true + + diff --git a/appinfo/routes.php b/appinfo/routes.php new file mode 100644 index 00000000..2b72baf5 --- /dev/null +++ b/appinfo/routes.php @@ -0,0 +1,7 @@ +create('files_pdfviewer_load', '/ajax/loadfile.php') + ->actionInclude('files_pdfviewer/ajax/loadfile.php'); + +$this->create('files_pdfviewer_loadpublic', '/ajax/loadpublicfile.php') + ->actionInclude('files_pdfviewer/ajax/loadpublicfile.php'); \ No newline at end of file diff --git a/appinfo/version b/appinfo/version new file mode 100644 index 00000000..d3827e75 --- /dev/null +++ b/appinfo/version @@ -0,0 +1 @@ +1.0 diff --git a/js/app.js b/js/app.js new file mode 100644 index 00000000..186aebfc --- /dev/null +++ b/js/app.js @@ -0,0 +1,153 @@ +function PDF_closePublicFileCallback() +{ + $('#imgframe').empty(); + $('#imgframe').text('Reloading...'); + window.location.reload(); +} + +function PDF_loadFile(file, dir) +{ + var urlD = OC.filePath('files_pdfviewer', 'ajax', 'loadfile.php') + "?file=" + encodeURIComponent(file) + + "&dir=" + encodeURIComponent(dir) + "&requesttoken=" + encodeURIComponent(oc_requesttoken); + + if($('#isPublic').attr('value') == '1') + { + urlD = urlD + "&token=" + encodeURIComponent($('#sharingToken').attr('value')); + } + + $('#pdfviewer-loader').remove(); + + var frame = $('#pdfviewer-frame'); + frame.attr('type', 'application/pdf'); + frame.attr('src', urlD); + frame.contents().find('title').html(file); + frame.on('load', function() + { + document.title = file; + }); +} + +function PDF_loadPublicFile(token) +{ + var urlD = OC.filePath('files_pdfviewer', 'ajax', 'loadpublicfile.php') + "?token=" + encodeURIComponent(token) + + "&requesttoken=" + encodeURIComponent(oc_requesttoken); + + $('#pdfviewer-loader').remove(); + + var frame = $('#pdfviewer-frame'); + frame.attr('type', 'application/pdf'); + frame.attr('src', urlD); +} + +/** + * Set up all html elements needed to display the notebook + */ +function PDF_setUpEditor(closeCallBack) +{ + isPDFViewerOpen = true; + var mainDiv = $('#pdfviewer'); + if(mainDiv.length < 1) + { + mainDiv = $('
'); + mainDiv.css('position', 'absolute'); + mainDiv.css('top', '0'); + mainDiv.css('left', '0'); + mainDiv.css('width', '100%'); + mainDiv.css('height', '100%'); + mainDiv.css('z-index', '200'); + mainDiv.css('background-color', '#fff'); + + var frame = $(''); + frame.css('position', 'absolute'); + frame.css('top', '0'); + frame.css('left', '0'); + frame.css('width', '100%'); + frame.css('height', '100%'); + + mainDiv.append(frame); + $('#content').append(mainDiv); + } + + var loadingImg = $('
'); + loadingImg.css('position', 'absolute'); + loadingImg.css('top', '50%'); + loadingImg.css('left', '50%'); + loadingImg.css('width', 'auto'); + loadingImg.css('height', 'auto'); + var img = OC.imagePath('core', 'loading-dark.gif'); + var imgContent = $(''); + imgContent.attr('src',img); + loadingImg.append(imgContent); + + var closeButton = $('
'); + closeButton.css('position', 'absolute'); + closeButton.css('top', '0'); + closeButton.css('left', '95%'); + closeButton.css('width', 'auto'); + closeButton.css('height', 'auto'); + closeButton.css('z-index', '200'); + closeButton.css('background-color', '#f00'); + var closeImg = OC.imagePath('core', 'actions/close.svg'); + var closeImgContent = $(''); + closeImgContent.attr('src', closeImg); + closeButton.append(closeImgContent); + + closeButton.click(function() { PDF_closeFile(closeCallBack); }); + + $('#app-navigation').hide(); + $('#app-content').hide(); + + mainDiv.append(loadingImg); + mainDiv.append(closeButton); +} + +/** + * Open the notebook viewer and displays the notebook given the directory where it belongs and it's name + * @param directory + * @param file + */ +function PDF_openFile(directory, file) +{ + PDF_setUpEditor(); + PDF_loadFile(file, directory); +} + +/** + * Open the notebook viewer and displays the notebook given by a publically shared by link + * @param token + */ +function PDF_openPublicFile(token) +{ + PDF_setUpEditor(closePublicFileCallback); + PDF_loadPublicFile(token); +} + + +function PDF_closeFile(callback) +{ + if(isPDFViewerOpen) + { + $('#pdfviewer').remove(); + $('#app-navigation').show(); + $('#app-content').show(); + isPDFViewerOpen = false; + + if(callback) + { + callback(); + } + } +} + +var isPDFViewerOpen = false; +$(document).ready(function () +{ + if (typeof FileActions !== 'undefined') + { + FileActions.setDefault('application/pdf', 'Edit'); + OCA.Files.fileActions.register('application/pdf', 'Edit', OC.PERMISSION_READ, '', function (filename) + { + PDF_openFile(FileList.getCurrentDirectory(), filename); + }); + } +}); \ No newline at end of file diff --git a/js/pdfobject.min.js b/js/pdfobject.min.js new file mode 100644 index 00000000..026b4d26 --- /dev/null +++ b/js/pdfobject.min.js @@ -0,0 +1,8 @@ +/* + PDFObject v2.0.201604172 + https://github.com/pipwerks/PDFObject + Copyright (c) 2008-2016 Philip Hutchison + MIT-style license: http://pipwerks.mit-license.org/ + UMD module pattern from https://github.com/umdjs/umd/blob/master/templates/returnExports.js +*/ +(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof module==="object"&&module.exports){module.exports=factory()}else{root.PDFObject=factory()}})(this,function(){"use strict";if(typeof window==="undefined"||typeof navigator==="undefined"){return false}var pdfobjectversion="2.0.201604172",supportsPDFs,createAXO,isIE,supportsPdfMimeType=typeof navigator.mimeTypes["application/pdf"]!=="undefined",supportsPdfActiveX,buildFragmentString,log,embedError,embed,getTargetElement,generatePDFJSiframe,isIOS=function(){return/iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase())}(),generateEmbedElement;createAXO=function(type){var ax;try{ax=new ActiveXObject(type)}catch(e){ax=null}return ax};isIE=function(){return!!(window.ActiveXObject||"ActiveXObject"in window)};supportsPdfActiveX=function(){return!!(createAXO("AcroPDF.PDF")||createAXO("PDF.PdfCtrl"))};supportsPDFs=supportsPdfMimeType||isIE()&&supportsPdfActiveX();buildFragmentString=function(pdfParams){var string="",prop;if(pdfParams){for(prop in pdfParams){if(pdfParams.hasOwnProperty(prop)){string+=encodeURIComponent(prop)+"="+encodeURIComponent(pdfParams[prop])+"&"}}if(string){string="#"+string;string=string.slice(0,string.length-1)}}return string};log=function(msg){if(typeof console!=="undefined"&&console.log){console.log("[PDFObject] "+msg)}};embedError=function(msg){log(msg);return false};getTargetElement=function(targetSelector){var targetNode=document.body;if(typeof targetSelector==="string"){targetNode=document.querySelector(targetSelector)}else if(typeof jQuery!=="undefined"&&targetSelector instanceof jQuery&&targetSelector.length){targetNode=targetSelector.get(0)}else if(typeof targetSelector.nodeType!=="undefined"&&targetSelector.nodeType===1){targetNode=targetSelector}return targetNode};generatePDFJSiframe=function(targetNode,url,pdfOpenFragment,PDFJS_URL,id){var fullURL=PDFJS_URL+"?file="+encodeURIComponent(url)+pdfOpenFragment;var scrollfix=isIOS?"-webkit-overflow-scrolling: touch; overflow-y: scroll; ":"overflow: hidden; ";var iframe="
";targetNode.className+=" pdfobject-container";targetNode.style.position="relative";targetNode.style.overflow="auto";targetNode.innerHTML=iframe;return targetNode.getElementsByTagName("iframe")[0]};generateEmbedElement=function(targetNode,targetSelector,url,pdfOpenFragment,width,height,id){var style="";if(targetSelector&&targetSelector!==document.body){style="width: "+width+"; height: "+height+";"}else{style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;"}targetNode.className+=" pdfobject-container";targetNode.innerHTML="";return targetNode.getElementsByTagName("embed")[0]};embed=function(url,targetSelector,options){if(typeof url!=="string"){return embedError("URL is not valid")}targetSelector=typeof targetSelector!=="undefined"?targetSelector:false;options=typeof options!=="undefined"?options:{};var id=options.id&&typeof options.id==="string"?"id='"+options.id+"'":"",page=options.page?options.page:false,pdfOpenParams=options.pdfOpenParams?options.pdfOpenParams:{},fallbackLink=typeof options.fallbackLink!=="undefined"?options.fallbackLink:true,width=options.width?options.width:"100%",height=options.height?options.height:"100%",forcePDFJS=typeof options.forcePDFJS==="boolean"?options.forcePDFJS:false,PDFJS_URL=options.PDFJS_URL?options.PDFJS_URL:false,targetNode=getTargetElement(targetSelector),fallbackHTML="",pdfOpenFragment="",fallbackHTML_default="

This browser does not support inline PDFs. Please download the PDF to view it: Download PDF

";if(!targetNode){return embedError("Target element cannot be determined")}if(page){pdfOpenParams.page=page}pdfOpenFragment=buildFragmentString(pdfOpenParams);if(forcePDFJS&&PDFJS_URL){return generatePDFJSiframe(targetNode,url,pdfOpenFragment,PDFJS_URL,id)}else if(supportsPDFs){return generateEmbedElement(targetNode,targetSelector,url,pdfOpenFragment,width,height,id)}else{if(PDFJS_URL){return generatePDFJSiframe(targetNode,url,pdfOpenFragment,PDFJS_URL,id)}else if(fallbackLink){fallbackHTML=typeof fallbackLink==="string"?fallbackLink:fallbackHTML_default;targetNode.innerHTML=fallbackHTML.replace(/\[url\]/g,url)}return embedError("This browser does not support embedded PDFs")}};return{embed:function(a,b,c){return embed(a,b,c)},pdfobjectversion:function(){return pdfobjectversion}(),supportsPDFs:function(){return supportsPDFs}()}}); \ No newline at end of file