PageRenderTime 29ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/application/controllers/ExportController.php

https://gitlab.com/klausmig/CloudSemanticWeb
PHP | 319 lines | 272 code | 37 blank | 10 comment | 18 complexity | f54a44183e33b25763c0a9787829cb31 MD5 | raw file
  1. <?php
  2. include_once(ROOT . DS . "libraries" . DS . "backend" . DS . "CreateZipFile" . DS . "CreateDirZip.php");
  3. include_once(ROOT . DS . "libraries" . DS . "backend" . DS . "pclzip" . DS . "pclzip.lib.php");
  4. class ExportController extends Controller {
  5. function createSlideString($deck_id){
  6. $slides_to_string ='';
  7. $deck = new Deck;
  8. $deck->createFromID($deck_id);
  9. $deck->content = $deck->fetchDeckContent ();
  10. foreach ($deck->content as $element){
  11. if (get_class ( $element ) == "Slide") {
  12. $slides_to_string = $slides_to_string.'<div class="slide" id="tree-'.$element->deck.'-slide-'.$element->id.'-'.$element->position.'-view">'.$element->content.'</div>'.PHP_EOL;
  13. }else{
  14. $slides_to_string = $slides_to_string.'<div class="deck" id="tree-'.$deck->id.'-deck-'.$element->id.'-'.$element->position.'">'. $this->createSlideString($element->id).'</div>' ;
  15. }
  16. }
  17. $img_pattern = '/\.\/upload\/media\/images\/\d+\//';
  18. $slides_to_string = preg_replace($img_pattern, '', $slides_to_string);
  19. return $slides_to_string;
  20. }
  21. function toSCO(){
  22. $deck_id = $_GET['deck_id'];
  23. if (isset($_GET['format'])){
  24. $format = $_GET['format'];
  25. }else{
  26. $format = 'scorm2004_3rd';
  27. }
  28. $scorm = new Scorm();
  29. $scorm->create($deck_id, $format);
  30. $deck_name = $scorm->root_deck_name;
  31. $archive = new PclZip($deck_name .'.zip');
  32. //adding sco universal metadata
  33. $v_list = $archive->create (
  34. ROOT . DS . 'libraries' . DS . 'backend' . DS . $format,
  35. PCLZIP_OPT_REMOVE_PATH, ROOT . DS . 'libraries' . DS . 'backend' . DS . $format,
  36. PCLZIP_OPT_ADD_TEMP_FILE_ON);
  37. if ($v_list == 0){
  38. die("Error : ".$archive->errorInfo(true));
  39. }
  40. //adding sco from tmp
  41. $v_list = $archive->add (
  42. ROOT . DS . 'tmp' . DS . $deck_name ,
  43. PCLZIP_OPT_REMOVE_PATH, ROOT . DS . 'tmp' . DS . $deck_name,
  44. PCLZIP_OPT_ADD_TEMP_FILE_ON);
  45. if ($v_list == 0){
  46. die("Error : ".$archive->errorInfo(true));
  47. }
  48. $archive->force_download();
  49. chmod(ROOT . DS . $deck_name .'.zip', 0777);
  50. unlink(ROOT . DS . $deck_name .'.zip');
  51. $this->RemoveDir(ROOT . DS . 'tmp' . DS . $deck_name);
  52. }
  53. function RemoveDir($path){
  54. if(file_exists($path) && is_dir($path)){
  55. $dirHandle = opendir($path);
  56. while (false !== ($file = readdir($dirHandle))){
  57. if ($file!='.' && $file!='..'){
  58. // delete the folders '.' and '..'
  59. $tmpPath=$path.'/'.$file;
  60. chmod($tmpPath, 0777);
  61. if (is_dir($tmpPath)){ // if the folder
  62. $this->RemoveDir($tmpPath);
  63. }
  64. else{
  65. if(file_exists($tmpPath)){
  66. // delete file
  67. unlink($tmpPath);
  68. }
  69. }
  70. }
  71. }
  72. closedir($dirHandle);
  73. // delete current folder
  74. if(file_exists($path)){
  75. rmdir($path);
  76. }
  77. }
  78. else{
  79. echo "The folder does not exist!";
  80. }
  81. }
  82. function toHTML() {
  83. $deck_id = $_GET['deck_id'];
  84. $deck = new Deck;
  85. $deck->createFromID($deck_id);
  86. $slides = $deck->getSlidesFull();
  87. $slides_to_string = array();
  88. $image_local_path = array();
  89. $image_name = array();
  90. $image_paths = array();
  91. $slides_to_string = $this->createSlideString($deck_id);
  92. foreach ($slides as $slide)
  93. {
  94. $img_pattern = '/\.\/upload\/media\/images\/\d+\/\d+\..../';
  95. preg_match_all($img_pattern, $slide->content, $matches);
  96. if(count($matches[0])){
  97. foreach($matches[0] as $img_path) {
  98. $image_paths[]=$img_path;
  99. }
  100. }
  101. }
  102. $html = "
  103. <!DOCTYPE html>
  104. <!--[if lt IE 7]> <html class=\"no-js ie6\" lang=\"en\"> <![endif]-->
  105. <!--[if IE 7]> <html class=\"no-js ie7\" lang=\"en\"> <![endif]-->
  106. <!--[if IE 8]> <html class=\"no-js ie8\" lang=\"en\"> <![endif]-->
  107. <!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"> <!--<![endif]-->
  108. <head>
  109. <meta charset=\"utf-8\">
  110. <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">
  111. <title>". $deck->title ."</title>
  112. <meta name=\"author\" content=". $deck->owner->username .">
  113. <meta name=\"deck_id\" content=". $deck->deck_id .">
  114. <meta name=\"deck_revision_id\" content=". $deck->id .">
  115. <meta name=\"viewport\" content=\"width=1024, user-scalable=no\">
  116. <!-- Core and extension CSS files -->
  117. <link rel=\"stylesheet\" href=\"deck.js/core/deck.core.css\">
  118. <link rel=\"stylesheet\" href=\"deck.js/extensions/goto/deck.goto.css\">
  119. <link rel=\"stylesheet\" href=\"deck.js/extensions/menu/deck.menu.css\">
  120. <link rel=\"stylesheet\" href=\"deck.js/extensions/navigation/deck.navigation.css\">
  121. <link rel=\"stylesheet\" href=\"deck.js/extensions/status/deck.status.css\">
  122. <link rel=\"stylesheet\" href=\"deck.js/extensions/hash/deck.hash.css\">
  123. <!-- Theme CSS files (menu swaps these out) -->
  124. <link rel=\"stylesheet\" id=\"style-theme-link\" href=\"default_theme/default.css\">
  125. <link rel=\"stylesheet\" id=\"transition-theme-link\" href=\"deck.js/themes/transition/horizontal-slide.css\">
  126. <!-- Custom CSS just for this page -->
  127. <link rel=\"stylesheet\" href=\"deck.js/introduction/introduction.css\">
  128. <link rel=\"stylesheet\" href=\"local.css\">
  129. <script src=\"deck.js/modernizr.custom.js\"></script>
  130. <script src=\"deck.js/jquery.js\"></script>
  131. <!-- client syntax highlightning -->
  132. <link href=\"deck.js/syntax/shThemeDefault.css\" rel=\"stylesheet\" type=\"text/css\" />
  133. <script src=\"deck.js/syntax/shCore.js\" type=\"text/javascript\"></script>
  134. <script src=\"deck.js/syntax/shAutoloader.js\" type=\"text/javascript\"></script>
  135. <script src=\"deck.js/syntax/shBrushTurtle.js\" type=\"text/javascript\"></script>
  136. <script type=\"text/javascript\" src=\"deck.js/MathJax.js\"></script>
  137. <script type=\"text/javascript\">
  138. function htmlDecode(input){
  139. var e = document.createElement(\"div\");
  140. e.innerHTML = input;
  141. return e.childNodes.length === 0 ? \"\" : e.childNodes[0].nodeValue;
  142. }
  143. function removeBRs(input){
  144. var r=input.replace(/<br>/gi,\"\");
  145. r=r.replace(/<br[0-9a-zA-Z]+>/gi,\"\");
  146. return r;
  147. }
  148. SyntaxHighlighter.defaults['toolbar'] = false;
  149. SyntaxHighlighter.all();
  150. </script>
  151. <script type=\"text/x-mathjax-config\">
  152. $(function() {
  153. MathJax.Hub.Config({
  154. skipStartupTypeset: true,
  155. extensions: [\"tex2jax.js\"],
  156. jax: [\"input/TeX\", \"output/HTML-CSS\"],
  157. tex2jax: {
  158. inlineMath: [ ['$','$'], [\"\\(\",\"\\)\"] ],
  159. displayMath: [ ['$$','$$'], [\"\\[\",\"\\]\"] ],
  160. processEscapes: true
  161. },
  162. \"HTML-CSS\": { availableFonts: [\"TeX\"] }
  163. });
  164. $.deck('.slide');
  165. MathJax.Hub.Queue([\"Typeset\",MathJax.Hub,'slide-area']);
  166. });
  167. </script>
  168. </head>
  169. <body class=\"deck-container\">
  170. <div class=\"theme-menu\">
  171. <h2>Themes</h2>
  172. <label for=\"style-themes\">Style:</label>
  173. <select id=\"style-themes\">
  174. <option selected value=\"default_theme/default.css\">Default</option>
  175. <option value=\"deck.js/themes/style/web-2.0.css\">Web 2.0</option>
  176. <option value=\"deck.js/themes/style/swiss.css\">Swiss</option>
  177. <option value=\"deck.js/themes/style/neon.css\">Neon</option>
  178. <option value=\"\">None</option>
  179. </select>
  180. <label for=\"transition-themes\">Transition:</label>
  181. <select id=\"transition-themes\">
  182. <option selected value=\"deck.js/themes/transition/horizontal-slide.css\">Horizontal Slide</option>
  183. <option value=\"deck.js/themes/transition/vertical-slide.css\">Vertical Slide</option>
  184. <option value=\"deck.js/themes/transition/fade.css\">Fade</option>
  185. <option value=\"\">None</option>
  186. </select>
  187. </div>" .
  188. $slides_to_string .
  189. "</div>
  190. </div>
  191. </div>
  192. <a href=\"#\" class=\"deck-prev-link\" title=\"Previous\">&#8592;</a>
  193. <a href=\"#\" class=\"deck-next-link\" title=\"Next\">&#8594;</a>
  194. <p class=\"deck-status\">
  195. <span class=\"deck-status-current\"></span>
  196. /
  197. <span class=\"deck-status-total\"></span>
  198. </p>
  199. <form action=\".\" method=\"get\" class=\"goto-form\">
  200. <label for=\"goto-slide\">Go to slide:</label>
  201. <input type=\"number\" name=\"slidenum\" id=\"goto-slide\">
  202. <input type=\"submit\" value=\"Go\">
  203. </form>
  204. <a href=\".\" title=\"Permalink to this slide\" class=\"deck-permalink\">#</a>
  205. <!-- Deck Core and extensions -->
  206. <script src=\"deck.js/core/deck.core.js\"></script>
  207. <script src=\"deck.js/extensions/menu/deck.menu.js\"></script>
  208. <script src=\"deck.js/extensions/goto/deck.goto.js\"></script>
  209. <script src=\"deck.js/extensions/status/deck.status.js\"></script>
  210. <script src=\"deck.js/extensions/navigation/deck.navigation.js\"></script>
  211. <script src=\"deck.js/extensions/hash/deck.hash.js\"></script>
  212. <!-- Specific to this page -->
  213. <script src=\"deck.js/introduction/introduction.js\"></script>
  214. <!-- Code Mirror -->
  215. <link rel=\"stylesheet\" href=\"codemirror/lib/codemirror.css\">
  216. <script src=\"codemirror/lib/codemirror.js\"></script>
  217. <script src=\"codemirror/mode/javascript/javascript.js\"></script>
  218. <script src=\"codemirror/mode/xml/xml.js\"></script>
  219. <script src=\"codemirror/mode/htmlmixed/htmlmixed.js\"></script>
  220. <script src=\"codemirror/mode/css/css.js\"></script>
  221. <script src=\"codemirror/mode/php/php.js\"></script>
  222. <script src=\"codemirror/mode/ntriples/ntriples.js\"></script>
  223. <script src=\"codemirror/mode/sparql/sparql.js\"></script>
  224. <script src=\"codemirror/lib/util/formatting.js\"></script>
  225. <!-- Code Mirror for deck.js -->
  226. <link rel=\"stylesheet\" href=\"deck.js/extensions/codemirror/deck.codemirror.css\">
  227. <script src=\"deck.js/extensions/codemirror/deck.codemirror.js\"></script>
  228. </body>
  229. </html>";
  230. $zipName="archive.zip";
  231. $libraries_folder = 'deck.js' . DS;
  232. $createZipFile = new createDirZip;
  233. $createZipFile->get_files_from_folder(ROOT . DS . 'libraries' . DS . 'frontend' . DS . 'deck.js' . DS, $libraries_folder);
  234. $fileToZip = "index.html";
  235. $createZipFile->addFile($html, $fileToZip);
  236. $fileContents = file_get_contents(ROOT . DS . "libraries" . DS . "frontend" . DS . "MathJax" . DS ."MathJax.js");
  237. $fileToZip = $libraries_folder."MathJax.js";
  238. $createZipFile->addFile($fileContents, $fileToZip);
  239. $fileContents = file_get_contents(ROOT . DS . "libraries" . DS . "frontend" . DS ."jquery.js");
  240. $fileToZip = $libraries_folder."jquery.js";
  241. $createZipFile->addFile($fileContents, $fileToZip);
  242. $fileContents = file_get_contents(ROOT . DS . "libraries" . DS . "frontend" . DS ."jquery.min.js");
  243. $fileToZip = $libraries_folder."jquery.min.js";
  244. $createZipFile->addFile($fileContents, $fileToZip);
  245. $createZipFile->get_files_from_folder(ROOT . DS . 'libraries' . DS . 'frontend' . DS . 'codemirror' . DS, 'codemirror'. DS);
  246. // adding images
  247. foreach($image_paths as $im){
  248. $fileContents = file_get_contents($im);
  249. $fileToZip = split('\/',$im);
  250. $fileToZip = $fileToZip[count($fileToZip)-1];
  251. $createZipFile->addFile($fileContents, $fileToZip);
  252. }
  253. //add default theme
  254. $style = new Style();
  255. $tmp=$style->getStyle($deck->default_theme);
  256. $createZipFile->addFile($tmp['css'], 'default_theme/default.css');
  257. $date = date('Y-m-d');
  258. $zipName = $this->sluggify($deck->title).'_'.$date."_".$zipName;
  259. $fd = fopen($zipName, "wb");
  260. $out = fwrite($fd,$createZipFile->getZippedfile());
  261. fclose($fd);
  262. $createZipFile->forceDownload($zipName);
  263. @unlink($zipName);
  264. }
  265. function locateImages($html) {
  266. }
  267. function sluggify($url){
  268. # Prep string with some basic normalization
  269. $url = strtolower($url);
  270. $url = strip_tags($url);
  271. $url = stripslashes($url);
  272. $url = html_entity_decode($url);
  273. # Remove quotes (can't, etc.)
  274. $url = str_replace('\'', '', $url);
  275. # Replace non-alpha numeric with hyphens
  276. $match = '/[^a-z0-9]+/';
  277. $replace = '-';
  278. $url = preg_replace($match, $replace, $url);
  279. $url = trim($url, '-');
  280. return $url;
  281. }
  282. }