CcShell.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <?php
  2. App::uses('AppShell', 'Console/Command');
  3. App::uses('Folder', 'Utility');
  4. App::uses('File', 'Utility');
  5. if (!defined('LF')) {
  6. define('LF', PHP_EOL); # use PHP to detect default linebreak
  7. }
  8. /**
  9. * Code Completion Shell
  10. * Workes perfectly with PHPDesigner - but should also work with most other IDEs out of the box
  11. *
  12. * @version 1.1
  13. * @cakephp 2.x
  14. * @author Mark Scherer
  15. * @license MIT
  16. */
  17. class CcShell extends AppShell {
  18. protected $plugins = null;
  19. protected $content = '';
  20. protected $appFiles = array();
  21. public function main() {
  22. $this->out('Code Completion Dump - customized for PHPDesigner');
  23. $this->filename = APP . 'CodeCompletion.php';
  24. # get classes
  25. $this->models();
  26. $this->behaviors();
  27. $this->controller();
  28. $this->helpers();
  29. $this->appFiles();
  30. # write to file
  31. $this->_dump();
  32. $this->out('...done');
  33. }
  34. public function models() {
  35. $files = $this->_getFiles('Model');
  36. $content = LF;
  37. $content .= '/*** model start ***/'.LF;
  38. $content .= 'class AppModel extends Model {'.LF;
  39. if (!empty($files)) {
  40. $content .= $this->_prepModels($files);
  41. }
  42. $content .= '}'.LF;
  43. $content .= '/*** model end ***/'.LF;
  44. $this->content .= $content;
  45. }
  46. public function behaviors() {
  47. $files = $this->_getFiles('Model/Behavior');
  48. $content = LF;
  49. $content .= '/*** behavior start ***/'.LF;
  50. $content .= 'class AppModel extends Model {'.LF;
  51. if (!empty($files)) {
  52. $content .= $this->_prepBehaviors($files);
  53. }
  54. $content .= '}'.LF;
  55. $content .= '/*** behavior end ***/'.LF;
  56. $this->content .= $content;
  57. }
  58. /**
  59. * Components + models
  60. */
  61. public function controller() {
  62. $content = LF;
  63. $content .= '/*** component start ***/'.LF;
  64. $content .= 'class AppController extends Controller {'.LF;
  65. $files = $this->_getFiles('Controller/Component');
  66. if (!empty($files)) {
  67. $content .= $this->_prepComponents($files);
  68. }
  69. $content .= LF.LF;
  70. $files = $this->_getFiles('Model');
  71. if (!empty($files)) {
  72. $content .= $this->_prepModels($files);
  73. }
  74. $content .= '}'.LF;
  75. $content .= '/*** component end ***/'.LF;
  76. $this->content .= $content;
  77. }
  78. public function helpers() {
  79. $files = $this->_getFiles('View/Helper');
  80. $content = LF;
  81. $content .= '/*** helper start ***/'.LF;
  82. $content .= 'class AppHelper extends Helper {'.LF;
  83. if (!empty($files)) {
  84. $content .= $this->_prepHelpers($files);
  85. }
  86. $content .= '}'.LF;
  87. $content .= '/*** helper end ***/'.LF;
  88. $this->content .= $content;
  89. }
  90. public function appFiles() {
  91. $files = $this->appFiles;
  92. $content = LF;
  93. $content .= '/*** plugin files start ***/'.LF;
  94. if (!empty($files)) {
  95. $content .= $this->_prepAppFiles($files);
  96. }
  97. $content .= '/*** plugin files end ***/'.LF;
  98. $this->content .= $content;
  99. }
  100. protected function _prepAppFiles($files) {
  101. $res = '';
  102. foreach ($files as $name => $parent) {
  103. $res .= 'class ' . $name . ' extends '.$parent.' {}' . LF;
  104. }
  105. return $res;
  106. }
  107. protected function _prepModels($files) {
  108. $res = '';
  109. foreach ($files as $name) {
  110. $res .= '
  111. /**
  112. * '.$name.'
  113. *
  114. * @var '.$name.'
  115. */
  116. public $'.$name.';
  117. '.LF;
  118. }
  119. $res .= ' public function __construct() {';
  120. foreach ($files as $name) {
  121. $res .= '
  122. $this->'.$name.' = new '.$name.'();';
  123. }
  124. $res .= LF.' }'.LF;
  125. return $res;
  126. }
  127. protected function _prepBehaviors($files) {
  128. $res = '';
  129. foreach ($files as $name) {
  130. if (!($varName = $this->_varName($name, 'Behavior'))) {
  131. continue;
  132. }
  133. $res .= '
  134. /**
  135. * '.$name.'Behavior
  136. *
  137. * @var '.$varName.'
  138. */
  139. public $'.$varName.';
  140. '.LF;
  141. }
  142. $res .= ' public function __construct() {';
  143. foreach ($files as $name) {
  144. if (!($varName = $this->_varName($name, 'Behavior'))) {
  145. continue;
  146. }
  147. $res .= '
  148. $this->'.$varName.' = new '.$name.'();';
  149. }
  150. $res .= LF.' }'.LF;
  151. return $res;
  152. }
  153. /**
  154. * Check on correctness to avoid duplicates
  155. */
  156. protected function _varName($name, $type) {
  157. if (($pos = strrpos($name, $type)) === false) {
  158. return '';
  159. //return $name;
  160. }
  161. return substr($name, 0, $pos);
  162. }
  163. protected function _prepComponents($files) {
  164. $res = '';
  165. foreach ($files as $name) {
  166. if (!($varName = $this->_varName($name, 'Component'))) {
  167. continue;
  168. }
  169. $res .= '
  170. /**
  171. * '.$name.'
  172. *
  173. * @var '.$varName.'
  174. */
  175. public $'.$varName.';
  176. '.LF;
  177. }
  178. $res .= ' public function __construct() {';
  179. foreach ($files as $name) {
  180. if (!($varName = $this->_varName($name, 'Component'))) {
  181. continue;
  182. }
  183. $res .= '
  184. $this->'.$varName.' = new '.$name.'();';
  185. }
  186. $res .= LF.' }'.LF;
  187. return $res;
  188. }
  189. protected function _prepHelpers($files) {
  190. # new ones
  191. $res = '';
  192. foreach ($files as $name) {
  193. if (!($varName = $this->_varName($name, 'Helper'))) {
  194. continue;
  195. }
  196. $res .= '
  197. /**
  198. * '.$name.'
  199. *
  200. * @var '.$varName.'
  201. */
  202. public $'.$varName.';
  203. '.LF;
  204. }
  205. $res .= ' public function __construct() {';
  206. foreach ($files as $name) {
  207. if (!($varName = $this->_varName($name, 'Helper'))) {
  208. continue;
  209. }
  210. $res .= '
  211. $this->'.$varName.' = new '.$name.'();';
  212. }
  213. $res .= LF.' }'.LF;
  214. return $res;
  215. }
  216. protected function _dump() {
  217. //$File = new File($this->filename, true);
  218. $content = '<?php exit();'.PHP_EOL.PHP_EOL;
  219. $content .= 'class CodeCompletion {'.PHP_EOL;
  220. $content .= '}'.PHP_EOL.PHP_EOL;
  221. $content .= '//Printed: '.date('d.m.Y, H:i:s').PHP_EOL;
  222. $content .= $this->content;
  223. //return $File->write($content);
  224. file_put_contents($this->filename, $content);
  225. }
  226. protected function _getFiles($type) {
  227. $files = App::objects($type, null, false);
  228. $corePath = App::core($type);
  229. $coreFiles = App::objects($type, $corePath, false);
  230. $files = array_merge($coreFiles, $files);
  231. //$paths = (array)App::path($type.'s');
  232. //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false);
  233. $appIndex = array_search('AppModel', $files);
  234. if ($appIndex !== false) {
  235. unset($files[$appIndex]);
  236. }
  237. if (!isset($this->plugins)) {
  238. $this->plugins = App::objects('plugin');
  239. }
  240. if (!empty($this->plugins)) {
  241. foreach ($this->plugins as $plugin) {
  242. $pluginType = $plugin.'.'.$type;
  243. $pluginFiles = App::objects($pluginType, null, false);
  244. if (!empty($pluginFiles)) {
  245. foreach ($pluginFiles as $file) {
  246. if (strpos($file, 'App'.$type) !== false) {
  247. //$this->appFiles[$file] = $plugin.'.'.$type;
  248. continue;
  249. }
  250. $files[] = $file;
  251. }
  252. }
  253. }
  254. }
  255. $files = array_unique($files);
  256. # no test/tmp files etc (helper.test.php or helper.OLD.php)
  257. foreach ($files as $key => $file) {
  258. if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) {
  259. unset($files[$key]);
  260. }
  261. }
  262. return $files;
  263. }
  264. }